xref: /aosp_15_r20/external/pdfium/fxjs/cjs_app.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 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 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_app.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
10*3ac0a46fSAndroid Build Coastguard Worker 
11*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
12*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
13*3ac0a46fSAndroid Build Coastguard Worker 
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fixed_zeroed_data_vector.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/stl_util.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_interactiveform.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_document.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_timerobj.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/global_timer.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/ijs_event_context.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_resources.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-container.h"
24*3ac0a46fSAndroid Build Coastguard Worker 
25*3ac0a46fSAndroid Build Coastguard Worker namespace {
26*3ac0a46fSAndroid Build Coastguard Worker 
27*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kStrViewerType[] = L"pdfium";
28*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kStrViewerVariation[] = L"Full";
29*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kStrPlatform[] = L"WIN";
30*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kStrLanguage[] = L"ENU";
31*3ac0a46fSAndroid Build Coastguard Worker constexpr int kNumViewerVersion = 8;
32*3ac0a46fSAndroid Build Coastguard Worker constexpr int kNumViewerVersionXfa = 11;
33*3ac0a46fSAndroid Build Coastguard Worker constexpr int kNumFormsVersion = 7;
34*3ac0a46fSAndroid Build Coastguard Worker 
35*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker const JSPropertySpec CJS_App::PropertySpecs[] = {
38*3ac0a46fSAndroid Build Coastguard Worker     {"activeDocs", get_active_docs_static, set_active_docs_static},
39*3ac0a46fSAndroid Build Coastguard Worker     {"calculate", get_calculate_static, set_calculate_static},
40*3ac0a46fSAndroid Build Coastguard Worker     {"formsVersion", get_forms_version_static, set_forms_version_static},
41*3ac0a46fSAndroid Build Coastguard Worker     {"fs", get_fs_static, set_fs_static},
42*3ac0a46fSAndroid Build Coastguard Worker     {"fullscreen", get_fullscreen_static, set_fullscreen_static},
43*3ac0a46fSAndroid Build Coastguard Worker     {"language", get_language_static, set_language_static},
44*3ac0a46fSAndroid Build Coastguard Worker     {"media", get_media_static, set_media_static},
45*3ac0a46fSAndroid Build Coastguard Worker     {"platform", get_platform_static, set_platform_static},
46*3ac0a46fSAndroid Build Coastguard Worker     {"runtimeHighlight", get_runtime_highlight_static,
47*3ac0a46fSAndroid Build Coastguard Worker      set_runtime_highlight_static},
48*3ac0a46fSAndroid Build Coastguard Worker     {"viewerType", get_viewer_type_static, set_viewer_type_static},
49*3ac0a46fSAndroid Build Coastguard Worker     {"viewerVariation", get_viewer_variation_static,
50*3ac0a46fSAndroid Build Coastguard Worker      set_viewer_variation_static},
51*3ac0a46fSAndroid Build Coastguard Worker     {"viewerVersion", get_viewer_version_static, set_viewer_version_static}};
52*3ac0a46fSAndroid Build Coastguard Worker 
53*3ac0a46fSAndroid Build Coastguard Worker const JSMethodSpec CJS_App::MethodSpecs[] = {
54*3ac0a46fSAndroid Build Coastguard Worker     {"alert", alert_static},
55*3ac0a46fSAndroid Build Coastguard Worker     {"beep", beep_static},
56*3ac0a46fSAndroid Build Coastguard Worker     {"browseForDoc", browseForDoc_static},
57*3ac0a46fSAndroid Build Coastguard Worker     {"clearInterval", clearInterval_static},
58*3ac0a46fSAndroid Build Coastguard Worker     {"clearTimeOut", clearTimeOut_static},
59*3ac0a46fSAndroid Build Coastguard Worker     {"execDialog", execDialog_static},
60*3ac0a46fSAndroid Build Coastguard Worker     {"execMenuItem", execMenuItem_static},
61*3ac0a46fSAndroid Build Coastguard Worker     {"findComponent", findComponent_static},
62*3ac0a46fSAndroid Build Coastguard Worker     {"goBack", goBack_static},
63*3ac0a46fSAndroid Build Coastguard Worker     {"goForward", goForward_static},
64*3ac0a46fSAndroid Build Coastguard Worker     {"launchURL", launchURL_static},
65*3ac0a46fSAndroid Build Coastguard Worker     {"mailMsg", mailMsg_static},
66*3ac0a46fSAndroid Build Coastguard Worker     {"newFDF", newFDF_static},
67*3ac0a46fSAndroid Build Coastguard Worker     {"newDoc", newDoc_static},
68*3ac0a46fSAndroid Build Coastguard Worker     {"openDoc", openDoc_static},
69*3ac0a46fSAndroid Build Coastguard Worker     {"openFDF", openFDF_static},
70*3ac0a46fSAndroid Build Coastguard Worker     {"popUpMenuEx", popUpMenuEx_static},
71*3ac0a46fSAndroid Build Coastguard Worker     {"popUpMenu", popUpMenu_static},
72*3ac0a46fSAndroid Build Coastguard Worker     {"response", response_static},
73*3ac0a46fSAndroid Build Coastguard Worker     {"setInterval", setInterval_static},
74*3ac0a46fSAndroid Build Coastguard Worker     {"setTimeOut", setTimeOut_static}};
75*3ac0a46fSAndroid Build Coastguard Worker 
76*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_App::ObjDefnID = 0;
77*3ac0a46fSAndroid Build Coastguard Worker 
78*3ac0a46fSAndroid Build Coastguard Worker const char CJS_App::kName[] = "app";
79*3ac0a46fSAndroid Build Coastguard Worker 
80*3ac0a46fSAndroid Build Coastguard Worker // static
GetObjDefnID()81*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_App::GetObjDefnID() {
82*3ac0a46fSAndroid Build Coastguard Worker   return ObjDefnID;
83*3ac0a46fSAndroid Build Coastguard Worker }
84*3ac0a46fSAndroid Build Coastguard Worker 
85*3ac0a46fSAndroid Build Coastguard Worker // static
DefineJSObjects(CFXJS_Engine * pEngine)86*3ac0a46fSAndroid Build Coastguard Worker void CJS_App::DefineJSObjects(CFXJS_Engine* pEngine) {
87*3ac0a46fSAndroid Build Coastguard Worker   ObjDefnID = pEngine->DefineObj(CJS_App::kName, FXJSOBJTYPE_STATIC,
88*3ac0a46fSAndroid Build Coastguard Worker                                  JSConstructor<CJS_App>, JSDestructor);
89*3ac0a46fSAndroid Build Coastguard Worker   DefineProps(pEngine, ObjDefnID, PropertySpecs);
90*3ac0a46fSAndroid Build Coastguard Worker   DefineMethods(pEngine, ObjDefnID, MethodSpecs);
91*3ac0a46fSAndroid Build Coastguard Worker }
92*3ac0a46fSAndroid Build Coastguard Worker 
CJS_App(v8::Local<v8::Object> pObject,CJS_Runtime * pRuntime)93*3ac0a46fSAndroid Build Coastguard Worker CJS_App::CJS_App(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
94*3ac0a46fSAndroid Build Coastguard Worker     : CJS_Object(pObject, pRuntime) {}
95*3ac0a46fSAndroid Build Coastguard Worker 
96*3ac0a46fSAndroid Build Coastguard Worker CJS_App::~CJS_App() = default;
97*3ac0a46fSAndroid Build Coastguard Worker 
get_active_docs(CJS_Runtime * pRuntime)98*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_active_docs(CJS_Runtime* pRuntime) {
99*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->GetThisObj();
100*3ac0a46fSAndroid Build Coastguard Worker   auto pJSDocument = JSGetObject<CJS_Document>(pRuntime->GetIsolate(), pObj);
101*3ac0a46fSAndroid Build Coastguard Worker   if (!pJSDocument)
102*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
103*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> aDocs = pRuntime->NewArray();
104*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutArrayElement(aDocs, 0, pJSDocument->ToV8Object());
105*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime->GetArrayLength(aDocs) > 0)
106*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(aDocs);
107*3ac0a46fSAndroid Build Coastguard Worker 
108*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewUndefined());
109*3ac0a46fSAndroid Build Coastguard Worker }
110*3ac0a46fSAndroid Build Coastguard Worker 
set_active_docs(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)111*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_active_docs(CJS_Runtime* pRuntime,
112*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
113*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker 
get_calculate(CJS_Runtime * pRuntime)116*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_calculate(CJS_Runtime* pRuntime) {
117*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(m_bCalculate));
118*3ac0a46fSAndroid Build Coastguard Worker }
119*3ac0a46fSAndroid Build Coastguard Worker 
set_calculate(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)120*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_calculate(CJS_Runtime* pRuntime,
121*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
122*3ac0a46fSAndroid Build Coastguard Worker   m_bCalculate = pRuntime->ToBoolean(vp);
123*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->GetFormFillEnv()->GetInteractiveForm()->EnableCalculate(
124*3ac0a46fSAndroid Build Coastguard Worker       m_bCalculate);
125*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
126*3ac0a46fSAndroid Build Coastguard Worker }
127*3ac0a46fSAndroid Build Coastguard Worker 
get_forms_version(CJS_Runtime * pRuntime)128*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_forms_version(CJS_Runtime* pRuntime) {
129*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(kNumFormsVersion));
130*3ac0a46fSAndroid Build Coastguard Worker }
131*3ac0a46fSAndroid Build Coastguard Worker 
set_forms_version(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)132*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_forms_version(CJS_Runtime* pRuntime,
133*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
134*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
135*3ac0a46fSAndroid Build Coastguard Worker }
136*3ac0a46fSAndroid Build Coastguard Worker 
get_viewer_type(CJS_Runtime * pRuntime)137*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_viewer_type(CJS_Runtime* pRuntime) {
138*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(kStrViewerType));
139*3ac0a46fSAndroid Build Coastguard Worker }
140*3ac0a46fSAndroid Build Coastguard Worker 
set_viewer_type(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)141*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_viewer_type(CJS_Runtime* pRuntime,
142*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
143*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
144*3ac0a46fSAndroid Build Coastguard Worker }
145*3ac0a46fSAndroid Build Coastguard Worker 
get_viewer_variation(CJS_Runtime * pRuntime)146*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_viewer_variation(CJS_Runtime* pRuntime) {
147*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(kStrViewerVariation));
148*3ac0a46fSAndroid Build Coastguard Worker }
149*3ac0a46fSAndroid Build Coastguard Worker 
set_viewer_variation(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)150*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_viewer_variation(CJS_Runtime* pRuntime,
151*3ac0a46fSAndroid Build Coastguard Worker                                          v8::Local<v8::Value> vp) {
152*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
153*3ac0a46fSAndroid Build Coastguard Worker }
154*3ac0a46fSAndroid Build Coastguard Worker 
get_viewer_version(CJS_Runtime * pRuntime)155*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_viewer_version(CJS_Runtime* pRuntime) {
156*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document::Extension* pContext =
157*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->GetFormFillEnv()->GetDocExtension();
158*3ac0a46fSAndroid Build Coastguard Worker   int version = pContext && pContext->ContainsExtensionForm()
159*3ac0a46fSAndroid Build Coastguard Worker                     ? kNumViewerVersionXfa
160*3ac0a46fSAndroid Build Coastguard Worker                     : kNumViewerVersion;
161*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(version));
162*3ac0a46fSAndroid Build Coastguard Worker }
163*3ac0a46fSAndroid Build Coastguard Worker 
set_viewer_version(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)164*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_viewer_version(CJS_Runtime* pRuntime,
165*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
166*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
167*3ac0a46fSAndroid Build Coastguard Worker }
168*3ac0a46fSAndroid Build Coastguard Worker 
get_platform(CJS_Runtime * pRuntime)169*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_platform(CJS_Runtime* pRuntime) {
170*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
171*3ac0a46fSAndroid Build Coastguard Worker   if (pFormFillEnv) {
172*3ac0a46fSAndroid Build Coastguard Worker     WideString platform = pFormFillEnv->GetPlatform();
173*3ac0a46fSAndroid Build Coastguard Worker     if (!platform.IsEmpty())
174*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString(platform.AsStringView()));
175*3ac0a46fSAndroid Build Coastguard Worker   }
176*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(kStrPlatform));
177*3ac0a46fSAndroid Build Coastguard Worker }
178*3ac0a46fSAndroid Build Coastguard Worker 
set_platform(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)179*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_platform(CJS_Runtime* pRuntime,
180*3ac0a46fSAndroid Build Coastguard Worker                                  v8::Local<v8::Value> vp) {
181*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
182*3ac0a46fSAndroid Build Coastguard Worker }
183*3ac0a46fSAndroid Build Coastguard Worker 
get_language(CJS_Runtime * pRuntime)184*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_language(CJS_Runtime* pRuntime) {
185*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
186*3ac0a46fSAndroid Build Coastguard Worker   if (pFormFillEnv) {
187*3ac0a46fSAndroid Build Coastguard Worker     WideString language = pFormFillEnv->GetLanguage();
188*3ac0a46fSAndroid Build Coastguard Worker     if (!language.IsEmpty())
189*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString(language.AsStringView()));
190*3ac0a46fSAndroid Build Coastguard Worker   }
191*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(kStrLanguage));
192*3ac0a46fSAndroid Build Coastguard Worker }
193*3ac0a46fSAndroid Build Coastguard Worker 
set_language(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)194*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_language(CJS_Runtime* pRuntime,
195*3ac0a46fSAndroid Build Coastguard Worker                                  v8::Local<v8::Value> vp) {
196*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
197*3ac0a46fSAndroid Build Coastguard Worker }
198*3ac0a46fSAndroid Build Coastguard Worker 
199*3ac0a46fSAndroid Build Coastguard Worker // creates a new fdf object that contains no data
200*3ac0a46fSAndroid Build Coastguard Worker // comment: need reader support
201*3ac0a46fSAndroid Build Coastguard Worker // note:
202*3ac0a46fSAndroid Build Coastguard Worker // CFDF_Document * CPDFSDK_FormFillEnvironment::NewFDF();
newFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)203*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::newFDF(CJS_Runtime* pRuntime,
204*3ac0a46fSAndroid Build Coastguard Worker                            const std::vector<v8::Local<v8::Value>>& params) {
205*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
206*3ac0a46fSAndroid Build Coastguard Worker }
207*3ac0a46fSAndroid Build Coastguard Worker 
208*3ac0a46fSAndroid Build Coastguard Worker // opens a specified pdf document and returns its document object
209*3ac0a46fSAndroid Build Coastguard Worker // comment:need reader support
210*3ac0a46fSAndroid Build Coastguard Worker // note: as defined in js reference, the proto of this function's fourth
211*3ac0a46fSAndroid Build Coastguard Worker // parmeters, how old an fdf document while do not show it.
212*3ac0a46fSAndroid Build Coastguard Worker // CFDF_Document * CPDFSDK_FormFillEnvironment::OpenFDF(string strPath,bool
213*3ac0a46fSAndroid Build Coastguard Worker // bUserConv);
214*3ac0a46fSAndroid Build Coastguard Worker 
openFDF(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)215*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::openFDF(CJS_Runtime* pRuntime,
216*3ac0a46fSAndroid Build Coastguard Worker                             const std::vector<v8::Local<v8::Value>>& params) {
217*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
218*3ac0a46fSAndroid Build Coastguard Worker }
219*3ac0a46fSAndroid Build Coastguard Worker 
alert(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)220*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::alert(CJS_Runtime* pRuntime,
221*3ac0a46fSAndroid Build Coastguard Worker                           const std::vector<v8::Local<v8::Value>>& params) {
222*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
223*3ac0a46fSAndroid Build Coastguard Worker       pRuntime, params, 4, "cMsg", "nIcon", "nType", "cTitle");
224*3ac0a46fSAndroid Build Coastguard Worker 
225*3ac0a46fSAndroid Build Coastguard Worker   if (!IsExpandedParamKnown(newParams[0]))
226*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
227*3ac0a46fSAndroid Build Coastguard Worker 
228*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
229*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormFillEnv)
230*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewNumber(0));
231*3ac0a46fSAndroid Build Coastguard Worker 
232*3ac0a46fSAndroid Build Coastguard Worker   WideString swMsg;
233*3ac0a46fSAndroid Build Coastguard Worker   if (newParams[0]->IsArray()) {
234*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Array> carray = pRuntime->ToArray(newParams[0]);
235*3ac0a46fSAndroid Build Coastguard Worker     swMsg = L"[";
236*3ac0a46fSAndroid Build Coastguard Worker     for (size_t i = 0; i < pRuntime->GetArrayLength(carray); ++i) {
237*3ac0a46fSAndroid Build Coastguard Worker       if (i)
238*3ac0a46fSAndroid Build Coastguard Worker         swMsg += L", ";
239*3ac0a46fSAndroid Build Coastguard Worker 
240*3ac0a46fSAndroid Build Coastguard Worker       swMsg += pRuntime->ToWideString(pRuntime->GetArrayElement(carray, i));
241*3ac0a46fSAndroid Build Coastguard Worker     }
242*3ac0a46fSAndroid Build Coastguard Worker     swMsg += L"]";
243*3ac0a46fSAndroid Build Coastguard Worker   } else {
244*3ac0a46fSAndroid Build Coastguard Worker     swMsg = pRuntime->ToWideString(newParams[0]);
245*3ac0a46fSAndroid Build Coastguard Worker   }
246*3ac0a46fSAndroid Build Coastguard Worker 
247*3ac0a46fSAndroid Build Coastguard Worker   int iIcon = JSPLATFORM_ALERT_ICON_DEFAULT;
248*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1]))
249*3ac0a46fSAndroid Build Coastguard Worker     iIcon = pRuntime->ToInt32(newParams[1]);
250*3ac0a46fSAndroid Build Coastguard Worker 
251*3ac0a46fSAndroid Build Coastguard Worker   int iType = JSPLATFORM_ALERT_BUTTON_DEFAULT;
252*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
253*3ac0a46fSAndroid Build Coastguard Worker     iType = pRuntime->ToInt32(newParams[2]);
254*3ac0a46fSAndroid Build Coastguard Worker 
255*3ac0a46fSAndroid Build Coastguard Worker   WideString swTitle;
256*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
257*3ac0a46fSAndroid Build Coastguard Worker     swTitle = pRuntime->ToWideString(newParams[3]);
258*3ac0a46fSAndroid Build Coastguard Worker   else
259*3ac0a46fSAndroid Build Coastguard Worker     swTitle = JSGetStringFromID(JSMessage::kAlert);
260*3ac0a46fSAndroid Build Coastguard Worker 
261*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->BeginBlock();
262*3ac0a46fSAndroid Build Coastguard Worker   pFormFillEnv->KillFocusAnnot({});
263*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Value> ret = pRuntime->NewNumber(
264*3ac0a46fSAndroid Build Coastguard Worker       pFormFillEnv->JS_appAlert(swMsg, swTitle, iType, iIcon));
265*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->EndBlock();
266*3ac0a46fSAndroid Build Coastguard Worker 
267*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(ret);
268*3ac0a46fSAndroid Build Coastguard Worker }
269*3ac0a46fSAndroid Build Coastguard Worker 
beep(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)270*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::beep(CJS_Runtime* pRuntime,
271*3ac0a46fSAndroid Build Coastguard Worker                          const std::vector<v8::Local<v8::Value>>& params) {
272*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
273*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
274*3ac0a46fSAndroid Build Coastguard Worker 
275*3ac0a46fSAndroid Build Coastguard Worker   int type = JSPLATFORM_BEEP_DEFAULT;
276*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(params[0]))
277*3ac0a46fSAndroid Build Coastguard Worker     type = pRuntime->ToInt32(params[0]);
278*3ac0a46fSAndroid Build Coastguard Worker 
279*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->GetFormFillEnv()->JS_appBeep(type);
280*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
281*3ac0a46fSAndroid Build Coastguard Worker }
282*3ac0a46fSAndroid Build Coastguard Worker 
findComponent(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)283*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::findComponent(
284*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
285*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
286*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
287*3ac0a46fSAndroid Build Coastguard Worker }
288*3ac0a46fSAndroid Build Coastguard Worker 
popUpMenuEx(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)289*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::popUpMenuEx(
290*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
291*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
292*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
293*3ac0a46fSAndroid Build Coastguard Worker }
294*3ac0a46fSAndroid Build Coastguard Worker 
get_fs(CJS_Runtime * pRuntime)295*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_fs(CJS_Runtime* pRuntime) {
296*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
297*3ac0a46fSAndroid Build Coastguard Worker }
298*3ac0a46fSAndroid Build Coastguard Worker 
set_fs(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)299*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_fs(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
300*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
301*3ac0a46fSAndroid Build Coastguard Worker }
302*3ac0a46fSAndroid Build Coastguard Worker 
setInterval(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)303*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::setInterval(
304*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
305*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
306*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() == 0 || params.size() > 2)
307*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
308*3ac0a46fSAndroid Build Coastguard Worker 
309*3ac0a46fSAndroid Build Coastguard Worker   WideString script = pRuntime->ToWideString(params[0]);
310*3ac0a46fSAndroid Build Coastguard Worker   if (script.IsEmpty())
311*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kInvalidInputError);
312*3ac0a46fSAndroid Build Coastguard Worker 
313*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwInterval = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 1000;
314*3ac0a46fSAndroid Build Coastguard Worker   auto timerRef = std::make_unique<GlobalTimer>(
315*3ac0a46fSAndroid Build Coastguard Worker       this, pRuntime, GlobalTimer::Type::kRepeating, script, dwInterval, 0);
316*3ac0a46fSAndroid Build Coastguard Worker   GlobalTimer* pTimerRef = timerRef.get();
317*3ac0a46fSAndroid Build Coastguard Worker   m_Timers.insert(std::move(timerRef));
318*3ac0a46fSAndroid Build Coastguard Worker 
319*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pRetObj = pRuntime->NewFXJSBoundObject(
320*3ac0a46fSAndroid Build Coastguard Worker       CJS_TimerObj::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
321*3ac0a46fSAndroid Build Coastguard Worker   if (pRetObj.IsEmpty())
322*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
323*3ac0a46fSAndroid Build Coastguard Worker 
324*3ac0a46fSAndroid Build Coastguard Worker   auto* pJS_TimerObj = static_cast<CJS_TimerObj*>(
325*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pRetObj));
326*3ac0a46fSAndroid Build Coastguard Worker 
327*3ac0a46fSAndroid Build Coastguard Worker   pJS_TimerObj->SetTimer(pTimerRef);
328*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRetObj);
329*3ac0a46fSAndroid Build Coastguard Worker }
330*3ac0a46fSAndroid Build Coastguard Worker 
setTimeOut(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)331*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::setTimeOut(
332*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
333*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
334*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() == 0 || params.size() > 2)
335*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
336*3ac0a46fSAndroid Build Coastguard Worker 
337*3ac0a46fSAndroid Build Coastguard Worker   WideString script = pRuntime->ToWideString(params[0]);
338*3ac0a46fSAndroid Build Coastguard Worker   if (script.IsEmpty())
339*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kInvalidInputError);
340*3ac0a46fSAndroid Build Coastguard Worker 
341*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwTimeOut = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 1000;
342*3ac0a46fSAndroid Build Coastguard Worker   auto timerRef =
343*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<GlobalTimer>(this, pRuntime, GlobalTimer::Type::kOneShot,
344*3ac0a46fSAndroid Build Coastguard Worker                                     script, dwTimeOut, dwTimeOut);
345*3ac0a46fSAndroid Build Coastguard Worker   GlobalTimer* pTimerRef = timerRef.get();
346*3ac0a46fSAndroid Build Coastguard Worker   m_Timers.insert(std::move(timerRef));
347*3ac0a46fSAndroid Build Coastguard Worker 
348*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pRetObj = pRuntime->NewFXJSBoundObject(
349*3ac0a46fSAndroid Build Coastguard Worker       CJS_TimerObj::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
350*3ac0a46fSAndroid Build Coastguard Worker   if (pRetObj.IsEmpty())
351*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
352*3ac0a46fSAndroid Build Coastguard Worker 
353*3ac0a46fSAndroid Build Coastguard Worker   auto* pJS_TimerObj = static_cast<CJS_TimerObj*>(
354*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pRetObj));
355*3ac0a46fSAndroid Build Coastguard Worker 
356*3ac0a46fSAndroid Build Coastguard Worker   pJS_TimerObj->SetTimer(pTimerRef);
357*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRetObj);
358*3ac0a46fSAndroid Build Coastguard Worker }
359*3ac0a46fSAndroid Build Coastguard Worker 
clearTimeOut(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)360*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::clearTimeOut(
361*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
362*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
363*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
364*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
365*3ac0a46fSAndroid Build Coastguard Worker 
366*3ac0a46fSAndroid Build Coastguard Worker   CJS_App::ClearTimerCommon(pRuntime, params[0]);
367*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
368*3ac0a46fSAndroid Build Coastguard Worker }
369*3ac0a46fSAndroid Build Coastguard Worker 
clearInterval(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)370*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::clearInterval(
371*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
372*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
373*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() != 1)
374*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
375*3ac0a46fSAndroid Build Coastguard Worker 
376*3ac0a46fSAndroid Build Coastguard Worker   CJS_App::ClearTimerCommon(pRuntime, params[0]);
377*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
378*3ac0a46fSAndroid Build Coastguard Worker }
379*3ac0a46fSAndroid Build Coastguard Worker 
ClearTimerCommon(CJS_Runtime * pRuntime,v8::Local<v8::Value> param)380*3ac0a46fSAndroid Build Coastguard Worker void CJS_App::ClearTimerCommon(CJS_Runtime* pRuntime,
381*3ac0a46fSAndroid Build Coastguard Worker                                v8::Local<v8::Value> param) {
382*3ac0a46fSAndroid Build Coastguard Worker   if (!param->IsObject())
383*3ac0a46fSAndroid Build Coastguard Worker     return;
384*3ac0a46fSAndroid Build Coastguard Worker 
385*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->ToObject(param);
386*3ac0a46fSAndroid Build Coastguard Worker   auto pTimer = JSGetObject<CJS_TimerObj>(pRuntime->GetIsolate(), pObj);
387*3ac0a46fSAndroid Build Coastguard Worker   if (!pTimer)
388*3ac0a46fSAndroid Build Coastguard Worker     return;
389*3ac0a46fSAndroid Build Coastguard Worker 
390*3ac0a46fSAndroid Build Coastguard Worker   GlobalTimer::Cancel(pTimer->GetTimerID());
391*3ac0a46fSAndroid Build Coastguard Worker }
392*3ac0a46fSAndroid Build Coastguard Worker 
execMenuItem(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)393*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::execMenuItem(
394*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
395*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
396*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
397*3ac0a46fSAndroid Build Coastguard Worker }
398*3ac0a46fSAndroid Build Coastguard Worker 
TimerProc(GlobalTimer * pTimer)399*3ac0a46fSAndroid Build Coastguard Worker void CJS_App::TimerProc(GlobalTimer* pTimer) {
400*3ac0a46fSAndroid Build Coastguard Worker   CJS_Runtime* pRuntime = pTimer->GetRuntime();
401*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime && (!pTimer->IsOneShot() || pTimer->GetTimeOut() > 0))
402*3ac0a46fSAndroid Build Coastguard Worker     RunJsScript(pRuntime, pTimer->GetJScript());
403*3ac0a46fSAndroid Build Coastguard Worker }
404*3ac0a46fSAndroid Build Coastguard Worker 
CancelProc(GlobalTimer * pTimer)405*3ac0a46fSAndroid Build Coastguard Worker void CJS_App::CancelProc(GlobalTimer* pTimer) {
406*3ac0a46fSAndroid Build Coastguard Worker   m_Timers.erase(fxcrt::MakeFakeUniquePtr(pTimer));
407*3ac0a46fSAndroid Build Coastguard Worker }
408*3ac0a46fSAndroid Build Coastguard Worker 
RunJsScript(CJS_Runtime * pRuntime,const WideString & wsScript)409*3ac0a46fSAndroid Build Coastguard Worker void CJS_App::RunJsScript(CJS_Runtime* pRuntime, const WideString& wsScript) {
410*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime->IsBlocking())
411*3ac0a46fSAndroid Build Coastguard Worker     return;
412*3ac0a46fSAndroid Build Coastguard Worker 
413*3ac0a46fSAndroid Build Coastguard Worker   IJS_Runtime::ScopedEventContext pContext(pRuntime);
414*3ac0a46fSAndroid Build Coastguard Worker   pContext->OnExternal_Exec();
415*3ac0a46fSAndroid Build Coastguard Worker   pContext->RunScript(wsScript);
416*3ac0a46fSAndroid Build Coastguard Worker }
417*3ac0a46fSAndroid Build Coastguard Worker 
goBack(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)418*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::goBack(CJS_Runtime* pRuntime,
419*3ac0a46fSAndroid Build Coastguard Worker                            const std::vector<v8::Local<v8::Value>>& params) {
420*3ac0a46fSAndroid Build Coastguard Worker   // Not supported, but do not return error.
421*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
422*3ac0a46fSAndroid Build Coastguard Worker }
423*3ac0a46fSAndroid Build Coastguard Worker 
goForward(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)424*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::goForward(CJS_Runtime* pRuntime,
425*3ac0a46fSAndroid Build Coastguard Worker                               const std::vector<v8::Local<v8::Value>>& params) {
426*3ac0a46fSAndroid Build Coastguard Worker   // Not supported, but do not return error.
427*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
428*3ac0a46fSAndroid Build Coastguard Worker }
429*3ac0a46fSAndroid Build Coastguard Worker 
mailMsg(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)430*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::mailMsg(CJS_Runtime* pRuntime,
431*3ac0a46fSAndroid Build Coastguard Worker                             const std::vector<v8::Local<v8::Value>>& params) {
432*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
433*3ac0a46fSAndroid Build Coastguard Worker       pRuntime, params, 6, "bUI", "cTo", "cCc", "cBcc", "cSubject", "cMsg");
434*3ac0a46fSAndroid Build Coastguard Worker 
435*3ac0a46fSAndroid Build Coastguard Worker   if (!IsExpandedParamKnown(newParams[0]))
436*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
437*3ac0a46fSAndroid Build Coastguard Worker 
438*3ac0a46fSAndroid Build Coastguard Worker   bool bUI = pRuntime->ToBoolean(newParams[0]);
439*3ac0a46fSAndroid Build Coastguard Worker   WideString cTo;
440*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1])) {
441*3ac0a46fSAndroid Build Coastguard Worker     cTo = pRuntime->ToWideString(newParams[1]);
442*3ac0a46fSAndroid Build Coastguard Worker   } else {
443*3ac0a46fSAndroid Build Coastguard Worker     // cTo parameter required when UI not invoked.
444*3ac0a46fSAndroid Build Coastguard Worker     if (!bUI)
445*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kParamError);
446*3ac0a46fSAndroid Build Coastguard Worker   }
447*3ac0a46fSAndroid Build Coastguard Worker 
448*3ac0a46fSAndroid Build Coastguard Worker   WideString cCc;
449*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
450*3ac0a46fSAndroid Build Coastguard Worker     cCc = pRuntime->ToWideString(newParams[2]);
451*3ac0a46fSAndroid Build Coastguard Worker 
452*3ac0a46fSAndroid Build Coastguard Worker   WideString cBcc;
453*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
454*3ac0a46fSAndroid Build Coastguard Worker     cBcc = pRuntime->ToWideString(newParams[3]);
455*3ac0a46fSAndroid Build Coastguard Worker 
456*3ac0a46fSAndroid Build Coastguard Worker   WideString cSubject;
457*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[4]))
458*3ac0a46fSAndroid Build Coastguard Worker     cSubject = pRuntime->ToWideString(newParams[4]);
459*3ac0a46fSAndroid Build Coastguard Worker 
460*3ac0a46fSAndroid Build Coastguard Worker   WideString cMsg;
461*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[5]))
462*3ac0a46fSAndroid Build Coastguard Worker     cMsg = pRuntime->ToWideString(newParams[5]);
463*3ac0a46fSAndroid Build Coastguard Worker 
464*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->BeginBlock();
465*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->GetFormFillEnv()->JS_docmailForm(pdfium::span<const uint8_t>(), bUI,
466*3ac0a46fSAndroid Build Coastguard Worker                                              cTo, cSubject, cCc, cBcc, cMsg);
467*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->EndBlock();
468*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
469*3ac0a46fSAndroid Build Coastguard Worker }
470*3ac0a46fSAndroid Build Coastguard Worker 
launchURL(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)471*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::launchURL(CJS_Runtime* pRuntime,
472*3ac0a46fSAndroid Build Coastguard Worker                               const std::vector<v8::Local<v8::Value>>& params) {
473*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported, but do not return error.
474*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
475*3ac0a46fSAndroid Build Coastguard Worker }
476*3ac0a46fSAndroid Build Coastguard Worker 
get_runtime_highlight(CJS_Runtime * pRuntime)477*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_runtime_highlight(CJS_Runtime* pRuntime) {
478*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(m_bRuntimeHighLight));
479*3ac0a46fSAndroid Build Coastguard Worker }
480*3ac0a46fSAndroid Build Coastguard Worker 
set_runtime_highlight(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)481*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_runtime_highlight(CJS_Runtime* pRuntime,
482*3ac0a46fSAndroid Build Coastguard Worker                                           v8::Local<v8::Value> vp) {
483*3ac0a46fSAndroid Build Coastguard Worker   m_bRuntimeHighLight = pRuntime->ToBoolean(vp);
484*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
485*3ac0a46fSAndroid Build Coastguard Worker }
486*3ac0a46fSAndroid Build Coastguard Worker 
get_fullscreen(CJS_Runtime * pRuntime)487*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_fullscreen(CJS_Runtime* pRuntime) {
488*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
489*3ac0a46fSAndroid Build Coastguard Worker }
490*3ac0a46fSAndroid Build Coastguard Worker 
set_fullscreen(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)491*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_fullscreen(CJS_Runtime* pRuntime,
492*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
493*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
494*3ac0a46fSAndroid Build Coastguard Worker }
495*3ac0a46fSAndroid Build Coastguard Worker 
popUpMenu(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)496*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::popUpMenu(CJS_Runtime* pRuntime,
497*3ac0a46fSAndroid Build Coastguard Worker                               const std::vector<v8::Local<v8::Value>>& params) {
498*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
499*3ac0a46fSAndroid Build Coastguard Worker }
500*3ac0a46fSAndroid Build Coastguard Worker 
browseForDoc(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)501*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::browseForDoc(
502*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
503*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
504*3ac0a46fSAndroid Build Coastguard Worker   // Unsafe, not supported, but do not return an error.
505*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
506*3ac0a46fSAndroid Build Coastguard Worker }
507*3ac0a46fSAndroid Build Coastguard Worker 
SysPathToPDFPath(const WideString & sOldPath)508*3ac0a46fSAndroid Build Coastguard Worker WideString CJS_App::SysPathToPDFPath(const WideString& sOldPath) {
509*3ac0a46fSAndroid Build Coastguard Worker   WideString sRet = L"/";
510*3ac0a46fSAndroid Build Coastguard Worker   for (const wchar_t& c : sOldPath) {
511*3ac0a46fSAndroid Build Coastguard Worker     if (c != L':')
512*3ac0a46fSAndroid Build Coastguard Worker       sRet += (c == L'\\') ? L'/' : c;
513*3ac0a46fSAndroid Build Coastguard Worker   }
514*3ac0a46fSAndroid Build Coastguard Worker   return sRet;
515*3ac0a46fSAndroid Build Coastguard Worker }
516*3ac0a46fSAndroid Build Coastguard Worker 
newDoc(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)517*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::newDoc(CJS_Runtime* pRuntime,
518*3ac0a46fSAndroid Build Coastguard Worker                            const std::vector<v8::Local<v8::Value>>& params) {
519*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
520*3ac0a46fSAndroid Build Coastguard Worker }
521*3ac0a46fSAndroid Build Coastguard Worker 
openDoc(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)522*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::openDoc(CJS_Runtime* pRuntime,
523*3ac0a46fSAndroid Build Coastguard Worker                             const std::vector<v8::Local<v8::Value>>& params) {
524*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
525*3ac0a46fSAndroid Build Coastguard Worker }
526*3ac0a46fSAndroid Build Coastguard Worker 
response(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)527*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::response(CJS_Runtime* pRuntime,
528*3ac0a46fSAndroid Build Coastguard Worker                              const std::vector<v8::Local<v8::Value>>& params) {
529*3ac0a46fSAndroid Build Coastguard Worker   std::vector<v8::Local<v8::Value>> newParams =
530*3ac0a46fSAndroid Build Coastguard Worker       ExpandKeywordParams(pRuntime, params, 5, "cQuestion", "cTitle",
531*3ac0a46fSAndroid Build Coastguard Worker                           "cDefault", "bPassword", "cLabel");
532*3ac0a46fSAndroid Build Coastguard Worker 
533*3ac0a46fSAndroid Build Coastguard Worker   if (!IsExpandedParamKnown(newParams[0]))
534*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
535*3ac0a46fSAndroid Build Coastguard Worker 
536*3ac0a46fSAndroid Build Coastguard Worker   WideString swQuestion = pRuntime->ToWideString(newParams[0]);
537*3ac0a46fSAndroid Build Coastguard Worker   WideString swTitle = L"PDF";
538*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[1]))
539*3ac0a46fSAndroid Build Coastguard Worker     swTitle = pRuntime->ToWideString(newParams[1]);
540*3ac0a46fSAndroid Build Coastguard Worker 
541*3ac0a46fSAndroid Build Coastguard Worker   WideString swDefault;
542*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[2]))
543*3ac0a46fSAndroid Build Coastguard Worker     swDefault = pRuntime->ToWideString(newParams[2]);
544*3ac0a46fSAndroid Build Coastguard Worker 
545*3ac0a46fSAndroid Build Coastguard Worker   bool bPassword = false;
546*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[3]))
547*3ac0a46fSAndroid Build Coastguard Worker     bPassword = pRuntime->ToBoolean(newParams[3]);
548*3ac0a46fSAndroid Build Coastguard Worker 
549*3ac0a46fSAndroid Build Coastguard Worker   WideString swLabel;
550*3ac0a46fSAndroid Build Coastguard Worker   if (IsExpandedParamKnown(newParams[4]))
551*3ac0a46fSAndroid Build Coastguard Worker     swLabel = pRuntime->ToWideString(newParams[4]);
552*3ac0a46fSAndroid Build Coastguard Worker 
553*3ac0a46fSAndroid Build Coastguard Worker   constexpr int kMaxWideChars = 1024;
554*3ac0a46fSAndroid Build Coastguard Worker   constexpr int kMaxBytes = kMaxWideChars * sizeof(uint16_t);
555*3ac0a46fSAndroid Build Coastguard Worker   FixedZeroedDataVector<uint16_t> buffer(kMaxWideChars);
556*3ac0a46fSAndroid Build Coastguard Worker   pdfium::span<uint16_t> buffer_span = buffer.writable_span();
557*3ac0a46fSAndroid Build Coastguard Worker   int byte_length = pRuntime->GetFormFillEnv()->JS_appResponse(
558*3ac0a46fSAndroid Build Coastguard Worker       swQuestion, swTitle, swDefault, swLabel, bPassword,
559*3ac0a46fSAndroid Build Coastguard Worker       pdfium::as_writable_bytes(buffer_span));
560*3ac0a46fSAndroid Build Coastguard Worker   if (byte_length < 0 || byte_length > kMaxBytes)
561*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamTooLongError);
562*3ac0a46fSAndroid Build Coastguard Worker 
563*3ac0a46fSAndroid Build Coastguard Worker   buffer_span = buffer_span.first(
564*3ac0a46fSAndroid Build Coastguard Worker       std::min<size_t>(kMaxWideChars, byte_length / sizeof(uint16_t)));
565*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(
566*3ac0a46fSAndroid Build Coastguard Worker       WideString::FromUTF16LE(buffer_span.data(), buffer_span.size())
567*3ac0a46fSAndroid Build Coastguard Worker           .AsStringView()));
568*3ac0a46fSAndroid Build Coastguard Worker }
569*3ac0a46fSAndroid Build Coastguard Worker 
get_media(CJS_Runtime * pRuntime)570*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::get_media(CJS_Runtime* pRuntime) {
571*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
572*3ac0a46fSAndroid Build Coastguard Worker }
573*3ac0a46fSAndroid Build Coastguard Worker 
set_media(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)574*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::set_media(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
575*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
576*3ac0a46fSAndroid Build Coastguard Worker }
577*3ac0a46fSAndroid Build Coastguard Worker 
execDialog(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)578*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_App::execDialog(
579*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
580*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
581*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
582*3ac0a46fSAndroid Build Coastguard Worker }
583