blob: dd706ebd8c862fe3255d3d887432101cbcc41c60 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 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.
Tom Sepezc6ab1722015-02-05 15:27:25 -08004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclairf766ad22016-03-14 13:51:24 -04007#include "fpdfsdk/javascript/app.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Lei Zhangaa8bf7e2015-12-24 19:13:32 -08009#include <memory>
Dan Sinclair3ebd1212016-03-09 09:59:23 -050010#include <vector>
Lei Zhangaa8bf7e2015-12-24 19:13:32 -080011
Dan Sinclair3ebd1212016-03-09 09:59:23 -050012#include "fpdfsdk/include/fsdk_mgr.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040013#include "fpdfsdk/javascript/Document.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040014#include "fpdfsdk/javascript/JS_Define.h"
15#include "fpdfsdk/javascript/JS_EventHandler.h"
16#include "fpdfsdk/javascript/JS_Object.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040017#include "fpdfsdk/javascript/JS_Value.h"
dsinclair64376be2016-03-31 20:03:24 -070018#include "fpdfsdk/javascript/cjs_context.h"
19#include "fpdfsdk/javascript/cjs_runtime.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040020#include "fpdfsdk/javascript/resource.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070021
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070022BEGIN_JS_STATIC_CONST(CJS_TimerObj)
23END_JS_STATIC_CONST()
24
25BEGIN_JS_STATIC_PROP(CJS_TimerObj)
26END_JS_STATIC_PROP()
27
28BEGIN_JS_STATIC_METHOD(CJS_TimerObj)
29END_JS_STATIC_METHOD()
30
31IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj)
32
33TimerObj::TimerObj(CJS_Object* pJSObject)
tsepez41a53ad2016-03-28 16:59:30 -070034 : CJS_EmbedObj(pJSObject), m_pTimer(nullptr) {}
Tom Sepezc6ab1722015-02-05 15:27:25 -080035
Nico Weber9d8ec5a2015-08-04 13:00:21 -070036TimerObj::~TimerObj() {}
37
38void TimerObj::SetTimer(CJS_Timer* pTimer) {
39 m_pTimer = pTimer;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070040}
41
Nico Weber9d8ec5a2015-08-04 13:00:21 -070042CJS_Timer* TimerObj::GetTimer() const {
43 return m_pTimer;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044}
45
Tom Sepezd6278ba2015-09-08 16:34:37 -070046#define JS_STR_VIEWERTYPE L"pdfium"
Nico Weber9d8ec5a2015-08-04 13:00:21 -070047#define JS_STR_VIEWERVARIATION L"Full"
48#define JS_STR_PLATFORM L"WIN"
49#define JS_STR_LANGUANGE L"ENU"
Tom Sepezd6278ba2015-09-08 16:34:37 -070050#define JS_NUM_VIEWERVERSION 8
Tom Sepez51da0932015-11-25 16:05:49 -080051#ifdef PDF_ENABLE_XFA
Tom Sepezd6278ba2015-09-08 16:34:37 -070052#define JS_NUM_VIEWERVERSION_XFA 11
Tom Sepez40e9ff32015-11-30 12:39:54 -080053#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -070054#define JS_NUM_FORMSVERSION 7
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070055
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070056BEGIN_JS_STATIC_CONST(CJS_App)
57END_JS_STATIC_CONST()
58
59BEGIN_JS_STATIC_PROP(CJS_App)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070060JS_STATIC_PROP_ENTRY(activeDocs)
61JS_STATIC_PROP_ENTRY(calculate)
62JS_STATIC_PROP_ENTRY(formsVersion)
63JS_STATIC_PROP_ENTRY(fs)
64JS_STATIC_PROP_ENTRY(fullscreen)
65JS_STATIC_PROP_ENTRY(language)
66JS_STATIC_PROP_ENTRY(media)
67JS_STATIC_PROP_ENTRY(platform)
68JS_STATIC_PROP_ENTRY(runtimeHighlight)
69JS_STATIC_PROP_ENTRY(viewerType)
70JS_STATIC_PROP_ENTRY(viewerVariation)
71JS_STATIC_PROP_ENTRY(viewerVersion)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070072END_JS_STATIC_PROP()
73
74BEGIN_JS_STATIC_METHOD(CJS_App)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075JS_STATIC_METHOD_ENTRY(alert)
76JS_STATIC_METHOD_ENTRY(beep)
77JS_STATIC_METHOD_ENTRY(browseForDoc)
78JS_STATIC_METHOD_ENTRY(clearInterval)
79JS_STATIC_METHOD_ENTRY(clearTimeOut)
80JS_STATIC_METHOD_ENTRY(execDialog)
81JS_STATIC_METHOD_ENTRY(execMenuItem)
82JS_STATIC_METHOD_ENTRY(findComponent)
83JS_STATIC_METHOD_ENTRY(goBack)
84JS_STATIC_METHOD_ENTRY(goForward)
85JS_STATIC_METHOD_ENTRY(launchURL)
86JS_STATIC_METHOD_ENTRY(mailMsg)
87JS_STATIC_METHOD_ENTRY(newFDF)
88JS_STATIC_METHOD_ENTRY(newDoc)
89JS_STATIC_METHOD_ENTRY(openDoc)
90JS_STATIC_METHOD_ENTRY(openFDF)
91JS_STATIC_METHOD_ENTRY(popUpMenuEx)
92JS_STATIC_METHOD_ENTRY(popUpMenu)
93JS_STATIC_METHOD_ENTRY(response)
94JS_STATIC_METHOD_ENTRY(setInterval)
95JS_STATIC_METHOD_ENTRY(setTimeOut)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070096END_JS_STATIC_METHOD()
97
Nico Weber9d8ec5a2015-08-04 13:00:21 -070098IMPLEMENT_JS_CLASS(CJS_App, app)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070099
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700100app::app(CJS_Object* pJSObject)
101 : CJS_EmbedObj(pJSObject), m_bCalculate(true), m_bRuntimeHighLight(false) {}
102
Lei Zhang2b1a2d52015-08-14 22:16:22 -0700103app::~app() {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700104}
105
Tom Sepezba038bc2015-10-08 12:03:00 -0700106FX_BOOL app::activeDocs(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107 CJS_PropValue& vp,
108 CFX_WideString& sError) {
109 if (!vp.IsGetting())
110 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700111
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700112 CJS_Context* pContext = (CJS_Context*)cc;
113 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
114 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
115 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700116 CJS_Array aDocs(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700117 if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) {
tsepez41a53ad2016-03-28 16:59:30 -0700118 CJS_Document* pJSDocument = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700119 if (pDoc == pCurDoc) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700120 v8::Local<v8::Object> pObj = FXJS_GetThisObj(pRuntime->GetIsolate());
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700121 if (FXJS_GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700122 pJSDocument =
Tom Sepez39bfe122015-09-17 15:25:23 -0700123 (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700124 } else {
Tom Sepez39bfe122015-09-17 15:25:23 -0700125 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700126 pRuntime->GetIsolate(), pRuntime, CJS_Document::g_nObjDefnID);
Tom Sepez39bfe122015-09-17 15:25:23 -0700127 pJSDocument =
128 (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj);
Lei Zhang96660d62015-12-14 18:27:25 -0800129 ASSERT(pJSDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700130 }
Tom Sepez67fd5df2015-10-08 12:24:19 -0700131 aDocs.SetElement(0, CJS_Value(pRuntime, pJSDocument));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700132 }
133 if (aDocs.GetLength() > 0)
134 vp << aDocs;
135 else
136 vp.SetNull();
137
138 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700139}
140
Tom Sepezba038bc2015-10-08 12:03:00 -0700141FX_BOOL app::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700142 CJS_PropValue& vp,
143 CFX_WideString& sError) {
144 if (vp.IsSetting()) {
145 bool bVP;
146 vp >> bVP;
147 m_bCalculate = (FX_BOOL)bVP;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700149 CJS_Context* pContext = (CJS_Context*)cc;
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700150 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
151 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700152 CJS_Array aDocs(pRuntime);
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700153 if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700154 pDoc->GetInterForm()->EnableCalculate((FX_BOOL)m_bCalculate);
155 } else {
156 vp << (bool)m_bCalculate;
157 }
158 return TRUE;
159}
160
Tom Sepezba038bc2015-10-08 12:03:00 -0700161FX_BOOL app::formsVersion(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700162 CJS_PropValue& vp,
163 CFX_WideString& sError) {
164 if (vp.IsGetting()) {
165 vp << JS_NUM_FORMSVERSION;
166 return TRUE;
167 }
168
169 return FALSE;
170}
171
Tom Sepezba038bc2015-10-08 12:03:00 -0700172FX_BOOL app::viewerType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700173 CJS_PropValue& vp,
174 CFX_WideString& sError) {
175 if (vp.IsGetting()) {
Tom Sepezd6278ba2015-09-08 16:34:37 -0700176 vp << JS_STR_VIEWERTYPE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 return TRUE;
178 }
179
180 return FALSE;
181}
182
Tom Sepezba038bc2015-10-08 12:03:00 -0700183FX_BOOL app::viewerVariation(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184 CJS_PropValue& vp,
185 CFX_WideString& sError) {
186 if (vp.IsGetting()) {
187 vp << JS_STR_VIEWERVARIATION;
188 return TRUE;
189 }
190
191 return FALSE;
192}
193
Tom Sepezba038bc2015-10-08 12:03:00 -0700194FX_BOOL app::viewerVersion(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700195 CJS_PropValue& vp,
196 CFX_WideString& sError) {
197 if (!vp.IsGetting())
198 return FALSE;
Tom Sepez51da0932015-11-25 16:05:49 -0800199#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700200 CJS_Context* pContext = (CJS_Context*)cc;
201 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
Tom Sepez50d12ad2015-11-24 09:50:51 -0800202 CPDFXFA_Document* pDoc = pCurDoc->GetXFADocument();
Tom Sepezbf59a072015-10-21 14:07:23 -0700203 if (pDoc->GetDocType() == 1 || pDoc->GetDocType() == 2) {
Tom Sepezd6278ba2015-09-08 16:34:37 -0700204 vp << JS_NUM_VIEWERVERSION_XFA;
Tom Sepezbf59a072015-10-21 14:07:23 -0700205 return TRUE;
206 }
Tom Sepez40e9ff32015-11-30 12:39:54 -0800207#endif // PDF_ENABLE_XFA
Tom Sepezbf59a072015-10-21 14:07:23 -0700208 vp << JS_NUM_VIEWERVERSION;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700209 return TRUE;
210}
211
Tom Sepezba038bc2015-10-08 12:03:00 -0700212FX_BOOL app::platform(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 CJS_PropValue& vp,
214 CFX_WideString& sError) {
Jun Fanga0217b62015-12-02 13:57:18 +0800215 if (!vp.IsGetting())
216 return FALSE;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800217#ifdef PDF_ENABLE_XFA
Jun Fanga0217b62015-12-02 13:57:18 +0800218 CPDFDoc_Environment* pEnv =
219 static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp();
220 if (!pEnv)
221 return FALSE;
222 CFX_WideString platfrom = pEnv->FFI_GetPlatform();
Tom Sepez4d6fa832015-12-08 11:31:59 -0800223 if (!platfrom.IsEmpty()) {
Jun Fanga0217b62015-12-02 13:57:18 +0800224 vp << platfrom;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800225 return TRUE;
226 }
227#endif
228 vp << JS_STR_PLATFORM;
Jun Fanga0217b62015-12-02 13:57:18 +0800229 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700230}
231
Tom Sepezba038bc2015-10-08 12:03:00 -0700232FX_BOOL app::language(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700233 CJS_PropValue& vp,
234 CFX_WideString& sError) {
Jun Fang487d1a92015-12-02 13:20:03 +0800235 if (!vp.IsGetting())
236 return FALSE;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800237#ifdef PDF_ENABLE_XFA
Jun Fang487d1a92015-12-02 13:20:03 +0800238 CPDFDoc_Environment* pEnv =
239 static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp();
240 if (!pEnv)
241 return FALSE;
242 CFX_WideString language = pEnv->FFI_GetLanguage();
Tom Sepez4d6fa832015-12-08 11:31:59 -0800243 if (!language.IsEmpty()) {
Jun Fang487d1a92015-12-02 13:20:03 +0800244 vp << language;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800245 return TRUE;
246 }
247#endif
248 vp << JS_STR_LANGUANGE;
Jun Fang487d1a92015-12-02 13:20:03 +0800249 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700250}
251
252// creates a new fdf object that contains no data
253// comment: need reader support
254// note:
255// CFDF_Document * CPDFDoc_Environment::NewFDF();
Tom Sepezba038bc2015-10-08 12:03:00 -0700256FX_BOOL app::newFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800257 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700258 CJS_Value& vRet,
259 CFX_WideString& sError) {
260 return TRUE;
261}
262// opens a specified pdf document and returns its document object
263// comment:need reader support
264// note: as defined in js reference, the proto of this function's fourth
265// parmeters, how old an fdf document while do not show it.
266// CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);
267
Tom Sepezba038bc2015-10-08 12:03:00 -0700268FX_BOOL app::openFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800269 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700270 CJS_Value& vRet,
271 CFX_WideString& sError) {
272 return TRUE;
273}
274
Tom Sepezba038bc2015-10-08 12:03:00 -0700275FX_BOOL app::alert(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800276 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700277 CJS_Value& vRet,
278 CFX_WideString& sError) {
Tom Sepezbd932572016-01-29 09:10:41 -0800279 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
Tom Sepez67fd5df2015-10-08 12:24:19 -0700280 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
Tom Sepezbd932572016-01-29 09:10:41 -0800281 std::vector<CJS_Value> newParams = JS_ExpandKeywordParams(
282 pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700283
Tom Sepezbd932572016-01-29 09:10:41 -0800284 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
285 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
286 return FALSE;
287 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700288
Tom Sepezbd932572016-01-29 09:10:41 -0800289 CFX_WideString swMsg;
290 if (newParams[0].GetType() == CJS_Value::VT_object) {
291 CJS_Array carray(pRuntime);
292 if (newParams[0].ConvertToArray(carray)) {
293 swMsg = L"[";
294 CJS_Value element(pRuntime);
295 for (int i = 0; i < carray.GetLength(); ++i) {
296 if (i)
297 swMsg += L", ";
298 carray.GetElement(i, element);
299 swMsg += element.ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700300 }
Tom Sepezbd932572016-01-29 09:10:41 -0800301 swMsg += L"]";
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302 } else {
Tom Sepezbd932572016-01-29 09:10:41 -0800303 swMsg = newParams[0].ToCFXWideString();
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700304 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700305 } else {
Tom Sepezbd932572016-01-29 09:10:41 -0800306 swMsg = newParams[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700307 }
308
Tom Sepezbd932572016-01-29 09:10:41 -0800309 int iIcon = 0;
310 if (newParams[1].GetType() != CJS_Value::VT_unknown)
311 iIcon = newParams[1].ToInt();
312
313 int iType = 0;
314 if (newParams[2].GetType() != CJS_Value::VT_unknown)
315 iType = newParams[2].ToInt();
316
317 CFX_WideString swTitle;
318 if (newParams[3].GetType() != CJS_Value::VT_unknown)
319 swTitle = newParams[3].ToCFXWideString();
320 else
321 swTitle = JSGetStringFromID(pContext, IDS_STRING_JSALERT);
322
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700323 pRuntime->BeginBlock();
Lei Zhangd607f5b2015-10-05 17:06:09 -0700324 vRet = MsgBox(pRuntime->GetReaderApp(), swMsg.c_str(), swTitle.c_str(), iType,
325 iIcon);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700326 pRuntime->EndBlock();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700327 return TRUE;
328}
329
Tom Sepezba038bc2015-10-08 12:03:00 -0700330FX_BOOL app::beep(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800331 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700332 CJS_Value& vRet,
333 CFX_WideString& sError) {
334 if (params.size() == 1) {
335 CJS_Context* pContext = (CJS_Context*)cc;
336 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
337 CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
338 pEnv->JS_appBeep(params[0].ToInt());
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700339 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340 }
341
342 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
343 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700344}
345
Tom Sepezba038bc2015-10-08 12:03:00 -0700346FX_BOOL app::findComponent(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800347 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700348 CJS_Value& vRet,
349 CFX_WideString& sError) {
350 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700351}
352
Tom Sepezba038bc2015-10-08 12:03:00 -0700353FX_BOOL app::popUpMenuEx(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800354 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355 CJS_Value& vRet,
356 CFX_WideString& sError) {
357 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700358}
359
Tom Sepezba038bc2015-10-08 12:03:00 -0700360FX_BOOL app::fs(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700361 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700362}
363
Tom Sepezba038bc2015-10-08 12:03:00 -0700364FX_BOOL app::setInterval(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800365 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700366 CJS_Value& vRet,
367 CFX_WideString& sError) {
368 CJS_Context* pContext = (CJS_Context*)cc;
369 if (params.size() > 2 || params.size() == 0) {
370 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
371 return FALSE;
372 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800373
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700374 CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L"";
375 if (script.IsEmpty()) {
376 sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700377 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700378 }
379
380 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
tsepezc3255f52016-03-25 14:52:27 -0700381 uint32_t dwInterval = params.size() > 1 ? params[1].ToInt() : 1000;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700382 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
tsepez41a53ad2016-03-28 16:59:30 -0700383 m_Timers.push_back(std::unique_ptr<CJS_Timer>(
384 new CJS_Timer(this, pApp, pRuntime, 0, script, dwInterval, 0)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700385
Tom Sepez39bfe122015-09-17 15:25:23 -0700386 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700387 pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID);
tsepez41a53ad2016-03-28 16:59:30 -0700388 CJS_TimerObj* pJS_TimerObj = static_cast<CJS_TimerObj*>(
389 FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj));
390 TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject());
391 pTimerObj->SetTimer(m_Timers.back().get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392
393 vRet = pRetObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700394 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700395}
396
Tom Sepezba038bc2015-10-08 12:03:00 -0700397FX_BOOL app::setTimeOut(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800398 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700399 CJS_Value& vRet,
400 CFX_WideString& sError) {
tsepez41a53ad2016-03-28 16:59:30 -0700401 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700402 if (params.size() > 2 || params.size() == 0) {
tsepez41a53ad2016-03-28 16:59:30 -0700403 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700404 return FALSE;
405 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800406
tsepez41a53ad2016-03-28 16:59:30 -0700407 CFX_WideString script = params[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700408 if (script.IsEmpty()) {
tsepez41a53ad2016-03-28 16:59:30 -0700409 sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410 return TRUE;
411 }
412
tsepezc3255f52016-03-25 14:52:27 -0700413 uint32_t dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000;
tsepez41a53ad2016-03-28 16:59:30 -0700414 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700415 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
tsepez41a53ad2016-03-28 16:59:30 -0700416 m_Timers.push_back(std::unique_ptr<CJS_Timer>(
417 new CJS_Timer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700418
Tom Sepez39bfe122015-09-17 15:25:23 -0700419 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700420 pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID);
tsepez41a53ad2016-03-28 16:59:30 -0700421
422 CJS_TimerObj* pJS_TimerObj = static_cast<CJS_TimerObj*>(
423 FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj));
424
425 TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject());
426 pTimerObj->SetTimer(m_Timers.back().get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427
428 vRet = pRetObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700429 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700430}
431
Tom Sepezba038bc2015-10-08 12:03:00 -0700432FX_BOOL app::clearTimeOut(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800433 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700434 CJS_Value& vRet,
435 CFX_WideString& sError) {
436 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 if (params.size() != 1) {
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700438 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439 return FALSE;
440 }
441
tsepez41a53ad2016-03-28 16:59:30 -0700442 app::ClearTimerCommon(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700443 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700444}
445
Tom Sepezba038bc2015-10-08 12:03:00 -0700446FX_BOOL app::clearInterval(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800447 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700448 CJS_Value& vRet,
449 CFX_WideString& sError) {
450 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451 if (params.size() != 1) {
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700452 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700453 return FALSE;
454 }
455
tsepez41a53ad2016-03-28 16:59:30 -0700456 app::ClearTimerCommon(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700457 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700458}
459
tsepez41a53ad2016-03-28 16:59:30 -0700460void app::ClearTimerCommon(const CJS_Value& param) {
461 if (param.GetType() != CJS_Value::VT_fxobject)
462 return;
463
464 v8::Local<v8::Object> pObj = param.ToV8Object();
465 if (FXJS_GetObjDefnID(pObj) != CJS_TimerObj::g_nObjDefnID)
466 return;
467
468 CJS_Object* pJSObj = param.ToCJSObject();
469 if (!pJSObj)
470 return;
471
472 TimerObj* pTimerObj = static_cast<TimerObj*>(pJSObj->GetEmbedObject());
473 if (!pTimerObj)
474 return;
475
476 CJS_Timer* pTimer = pTimerObj->GetTimer();
477 if (!pTimer)
478 return;
479
480 pTimer->KillJSTimer();
481 auto iter = std::find_if(m_Timers.begin(), m_Timers.end(),
482 [pTimer](const std::unique_ptr<CJS_Timer>& that) {
483 return pTimer == that.get();
484 });
485
486 if (iter != m_Timers.end())
487 m_Timers.erase(iter);
488
489 pTimerObj->SetTimer(nullptr);
490}
491
Tom Sepezba038bc2015-10-08 12:03:00 -0700492FX_BOOL app::execMenuItem(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800493 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700494 CJS_Value& vRet,
495 CFX_WideString& sError) {
496 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700497}
498
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700499void app::TimerProc(CJS_Timer* pTimer) {
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700500 CJS_Runtime* pRuntime = pTimer->GetRuntime();
501
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700502 switch (pTimer->GetType()) {
503 case 0: // interval
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700504 if (pRuntime)
505 RunJsScript(pRuntime, pTimer->GetJScript());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700506 break;
507 case 1:
508 if (pTimer->GetTimeOut() > 0) {
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700509 if (pRuntime)
510 RunJsScript(pRuntime, pTimer->GetJScript());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511 pTimer->KillJSTimer();
512 }
513 break;
514 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700515}
516
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517void app::RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700518 if (!pRuntime->IsBlocking()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700519 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700520 pContext->OnExternal_Exec();
521 CFX_WideString wtInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700522 pContext->RunScript(wsScript, &wtInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700523 pRuntime->ReleaseContext(pContext);
524 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700525}
526
Tom Sepezba038bc2015-10-08 12:03:00 -0700527FX_BOOL app::goBack(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800528 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700529 CJS_Value& vRet,
530 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800531 // Not supported.
532 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700533}
534
Tom Sepezba038bc2015-10-08 12:03:00 -0700535FX_BOOL app::goForward(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800536 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700537 CJS_Value& vRet,
538 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800539 // Not supported.
540 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700541}
542
Tom Sepezba038bc2015-10-08 12:03:00 -0700543FX_BOOL app::mailMsg(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800544 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700545 CJS_Value& vRet,
546 CFX_WideString& sError) {
Tom Sepez67fd5df2015-10-08 12:24:19 -0700547 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
548 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800549 std::vector<CJS_Value> newParams =
550 JS_ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc",
551 L"cBcc", L"cSubject", L"cMsg");
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700552
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800553 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
554 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
555 return FALSE;
556 }
557 bool bUI = newParams[0].ToBool();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700558
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800559 CFX_WideString cTo;
560 if (newParams[1].GetType() != CJS_Value::VT_unknown) {
561 cTo = newParams[1].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700562 } else {
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800563 if (!bUI) {
564 // cTo parameter required when UI not invoked.
565 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700566 return FALSE;
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800567 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700568 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800569
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800570 CFX_WideString cCc;
571 if (newParams[2].GetType() != CJS_Value::VT_unknown)
572 cCc = newParams[2].ToCFXWideString();
573
574 CFX_WideString cBcc;
575 if (newParams[3].GetType() != CJS_Value::VT_unknown)
576 cBcc = newParams[3].ToCFXWideString();
577
578 CFX_WideString cSubject;
579 if (newParams[4].GetType() != CJS_Value::VT_unknown)
580 cSubject = newParams[4].ToCFXWideString();
581
582 CFX_WideString cMsg;
583 if (newParams[5].GetType() != CJS_Value::VT_unknown)
584 cMsg = newParams[5].ToCFXWideString();
585
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700586 pRuntime->BeginBlock();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800587 pContext->GetReaderApp()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(),
Tom Sepez67fd5df2015-10-08 12:24:19 -0700588 cSubject.c_str(), cCc.c_str(),
589 cBcc.c_str(), cMsg.c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700590 pRuntime->EndBlock();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800591 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700592}
593
Tom Sepezba038bc2015-10-08 12:03:00 -0700594FX_BOOL app::launchURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800595 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700596 CJS_Value& vRet,
597 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800598 // Unsafe, not supported.
599 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700600}
601
Tom Sepezba038bc2015-10-08 12:03:00 -0700602FX_BOOL app::runtimeHighlight(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700603 CJS_PropValue& vp,
604 CFX_WideString& sError) {
605 if (vp.IsSetting()) {
606 vp >> m_bRuntimeHighLight;
607 } else {
608 vp << m_bRuntimeHighLight;
609 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700610 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700611}
612
Tom Sepezba038bc2015-10-08 12:03:00 -0700613FX_BOOL app::fullscreen(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700614 CJS_PropValue& vp,
615 CFX_WideString& sError) {
616 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700617}
618
Tom Sepezba038bc2015-10-08 12:03:00 -0700619FX_BOOL app::popUpMenu(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800620 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700621 CJS_Value& vRet,
622 CFX_WideString& sError) {
623 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700624}
625
Tom Sepezba038bc2015-10-08 12:03:00 -0700626FX_BOOL app::browseForDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800627 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700628 CJS_Value& vRet,
629 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800630 // Unsafe, not supported.
631 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700632}
633
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700634CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath) {
635 CFX_WideString sRet = L"/";
Tom Sepezc6ab1722015-02-05 15:27:25 -0800636
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700637 for (int i = 0, sz = sOldPath.GetLength(); i < sz; i++) {
638 wchar_t c = sOldPath.GetAt(i);
639 if (c == L':') {
640 } else {
641 if (c == L'\\') {
642 sRet += L"/";
643 } else {
644 sRet += c;
645 }
646 }
647 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800648
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700649 return sRet;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700650}
651
Tom Sepezba038bc2015-10-08 12:03:00 -0700652FX_BOOL app::newDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800653 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700654 CJS_Value& vRet,
655 CFX_WideString& sError) {
656 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700657}
658
Tom Sepezba038bc2015-10-08 12:03:00 -0700659FX_BOOL app::openDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800660 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700661 CJS_Value& vRet,
662 CFX_WideString& sError) {
663 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700664}
665
Tom Sepezba038bc2015-10-08 12:03:00 -0700666FX_BOOL app::response(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800667 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700668 CJS_Value& vRet,
669 CFX_WideString& sError) {
Tom Sepez58fb36a2016-02-01 10:32:14 -0800670 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
Tom Sepez67fd5df2015-10-08 12:24:19 -0700671 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
Tom Sepez58fb36a2016-02-01 10:32:14 -0800672 std::vector<CJS_Value> newParams =
673 JS_ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle",
674 L"cDefault", L"bPassword", L"cLabel");
Tom Sepez621d4de2014-07-29 14:01:21 -0700675
Tom Sepez58fb36a2016-02-01 10:32:14 -0800676 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
677 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
678 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700679 }
Tom Sepez58fb36a2016-02-01 10:32:14 -0800680 CFX_WideString swQuestion = newParams[0].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700681
Tom Sepez58fb36a2016-02-01 10:32:14 -0800682 CFX_WideString swTitle = L"PDF";
683 if (newParams[1].GetType() != CJS_Value::VT_unknown)
684 swTitle = newParams[1].ToCFXWideString();
685
686 CFX_WideString swDefault;
687 if (newParams[2].GetType() != CJS_Value::VT_unknown)
688 swDefault = newParams[2].ToCFXWideString();
689
690 bool bPassword = false;
691 if (newParams[3].GetType() != CJS_Value::VT_unknown)
692 bPassword = newParams[3].ToBool();
693
694 CFX_WideString swLabel;
695 if (newParams[4].GetType() != CJS_Value::VT_unknown)
696 swLabel = newParams[4].ToCFXWideString();
Tom Sepez621d4de2014-07-29 14:01:21 -0700697
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700698 const int MAX_INPUT_BYTES = 2048;
Lei Zhangaa8bf7e2015-12-24 19:13:32 -0800699 std::unique_ptr<char[]> pBuff(new char[MAX_INPUT_BYTES + 2]);
Lei Zhangdb5256f2015-10-02 10:11:43 -0700700 memset(pBuff.get(), 0, MAX_INPUT_BYTES + 2);
Tom Sepez58fb36a2016-02-01 10:32:14 -0800701
702 int nLengthBytes = pContext->GetReaderApp()->JS_appResponse(
Lei Zhangdb5256f2015-10-02 10:11:43 -0700703 swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(), swLabel.c_str(),
Tom Sepez58fb36a2016-02-01 10:32:14 -0800704 bPassword, pBuff.get(), MAX_INPUT_BYTES);
705
706 if (nLengthBytes < 0 || nLengthBytes > MAX_INPUT_BYTES) {
707 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700708 return FALSE;
709 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700710
Tom Sepez58fb36a2016-02-01 10:32:14 -0800711 vRet = CFX_WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.get()),
712 nLengthBytes / sizeof(uint16_t))
713 .c_str();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700714 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700715}
716
Tom Sepezba038bc2015-10-08 12:03:00 -0700717FX_BOOL app::media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700718 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700719}
720
Tom Sepezba038bc2015-10-08 12:03:00 -0700721FX_BOOL app::execDialog(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800722 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700723 CJS_Value& vRet,
724 CFX_WideString& sError) {
725 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700726}