blob: a9227a7bdbf0b8af543d8774de25f1951e329db3 [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 Sinclairefbc1912016-02-17 16:54:43 -05007#include "fpdfsdk/src/javascript/app.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Lei Zhangaa8bf7e2015-12-24 19:13:32 -08009#include <memory>
10
Lei Zhangbde53d22015-11-12 22:21:30 -080011#include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment.
12#include "fpdfsdk/include/javascript/IJavaScript.h"
Dan Sinclairefbc1912016-02-17 16:54:43 -050013#include "fpdfsdk/src/javascript/Document.h"
14#include "fpdfsdk/src/javascript/JS_Context.h"
15#include "fpdfsdk/src/javascript/JS_Define.h"
16#include "fpdfsdk/src/javascript/JS_EventHandler.h"
17#include "fpdfsdk/src/javascript/JS_Object.h"
18#include "fpdfsdk/src/javascript/JS_Runtime.h"
19#include "fpdfsdk/src/javascript/JS_Value.h"
20#include "fpdfsdk/src/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)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070034 : CJS_EmbedObj(pJSObject), m_pTimer(NULL) {}
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() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700104 for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++)
105 delete m_aTimer[i];
106
107 m_aTimer.RemoveAll();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700108}
109
Tom Sepezba038bc2015-10-08 12:03:00 -0700110FX_BOOL app::activeDocs(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700111 CJS_PropValue& vp,
112 CFX_WideString& sError) {
113 if (!vp.IsGetting())
114 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700115
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 CJS_Context* pContext = (CJS_Context*)cc;
117 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
118 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
119 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700120 CJS_Array aDocs(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121 if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) {
122 CJS_Document* pJSDocument = NULL;
123 if (pDoc == pCurDoc) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700124 v8::Local<v8::Object> pObj = FXJS_GetThisObj(pRuntime->GetIsolate());
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700125 if (FXJS_GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700126 pJSDocument =
Tom Sepez39bfe122015-09-17 15:25:23 -0700127 (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700128 } else {
Tom Sepez39bfe122015-09-17 15:25:23 -0700129 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700130 pRuntime->GetIsolate(), pRuntime, CJS_Document::g_nObjDefnID);
Tom Sepez39bfe122015-09-17 15:25:23 -0700131 pJSDocument =
132 (CJS_Document*)FXJS_GetPrivate(pRuntime->GetIsolate(), pObj);
Lei Zhang96660d62015-12-14 18:27:25 -0800133 ASSERT(pJSDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134 }
Tom Sepez67fd5df2015-10-08 12:24:19 -0700135 aDocs.SetElement(0, CJS_Value(pRuntime, pJSDocument));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700136 }
137 if (aDocs.GetLength() > 0)
138 vp << aDocs;
139 else
140 vp.SetNull();
141
142 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143}
144
Tom Sepezba038bc2015-10-08 12:03:00 -0700145FX_BOOL app::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 CJS_PropValue& vp,
147 CFX_WideString& sError) {
148 if (vp.IsSetting()) {
149 bool bVP;
150 vp >> bVP;
151 m_bCalculate = (FX_BOOL)bVP;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700152
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700153 CJS_Context* pContext = (CJS_Context*)cc;
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700154 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
155 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700156 CJS_Array aDocs(pRuntime);
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700157 if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700158 pDoc->GetInterForm()->EnableCalculate((FX_BOOL)m_bCalculate);
159 } else {
160 vp << (bool)m_bCalculate;
161 }
162 return TRUE;
163}
164
Tom Sepezba038bc2015-10-08 12:03:00 -0700165FX_BOOL app::formsVersion(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700166 CJS_PropValue& vp,
167 CFX_WideString& sError) {
168 if (vp.IsGetting()) {
169 vp << JS_NUM_FORMSVERSION;
170 return TRUE;
171 }
172
173 return FALSE;
174}
175
Tom Sepezba038bc2015-10-08 12:03:00 -0700176FX_BOOL app::viewerType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 CJS_PropValue& vp,
178 CFX_WideString& sError) {
179 if (vp.IsGetting()) {
Tom Sepezd6278ba2015-09-08 16:34:37 -0700180 vp << JS_STR_VIEWERTYPE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700181 return TRUE;
182 }
183
184 return FALSE;
185}
186
Tom Sepezba038bc2015-10-08 12:03:00 -0700187FX_BOOL app::viewerVariation(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700188 CJS_PropValue& vp,
189 CFX_WideString& sError) {
190 if (vp.IsGetting()) {
191 vp << JS_STR_VIEWERVARIATION;
192 return TRUE;
193 }
194
195 return FALSE;
196}
197
Tom Sepezba038bc2015-10-08 12:03:00 -0700198FX_BOOL app::viewerVersion(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700199 CJS_PropValue& vp,
200 CFX_WideString& sError) {
201 if (!vp.IsGetting())
202 return FALSE;
Tom Sepez51da0932015-11-25 16:05:49 -0800203#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700204 CJS_Context* pContext = (CJS_Context*)cc;
205 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
Tom Sepez50d12ad2015-11-24 09:50:51 -0800206 CPDFXFA_Document* pDoc = pCurDoc->GetXFADocument();
Tom Sepezbf59a072015-10-21 14:07:23 -0700207 if (pDoc->GetDocType() == 1 || pDoc->GetDocType() == 2) {
Tom Sepezd6278ba2015-09-08 16:34:37 -0700208 vp << JS_NUM_VIEWERVERSION_XFA;
Tom Sepezbf59a072015-10-21 14:07:23 -0700209 return TRUE;
210 }
Tom Sepez40e9ff32015-11-30 12:39:54 -0800211#endif // PDF_ENABLE_XFA
Tom Sepezbf59a072015-10-21 14:07:23 -0700212 vp << JS_NUM_VIEWERVERSION;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 return TRUE;
214}
215
Tom Sepezba038bc2015-10-08 12:03:00 -0700216FX_BOOL app::platform(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700217 CJS_PropValue& vp,
218 CFX_WideString& sError) {
Jun Fanga0217b62015-12-02 13:57:18 +0800219 if (!vp.IsGetting())
220 return FALSE;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800221#ifdef PDF_ENABLE_XFA
Jun Fanga0217b62015-12-02 13:57:18 +0800222 CPDFDoc_Environment* pEnv =
223 static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp();
224 if (!pEnv)
225 return FALSE;
226 CFX_WideString platfrom = pEnv->FFI_GetPlatform();
Tom Sepez4d6fa832015-12-08 11:31:59 -0800227 if (!platfrom.IsEmpty()) {
Jun Fanga0217b62015-12-02 13:57:18 +0800228 vp << platfrom;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800229 return TRUE;
230 }
231#endif
232 vp << JS_STR_PLATFORM;
Jun Fanga0217b62015-12-02 13:57:18 +0800233 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234}
235
Tom Sepezba038bc2015-10-08 12:03:00 -0700236FX_BOOL app::language(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700237 CJS_PropValue& vp,
238 CFX_WideString& sError) {
Jun Fang487d1a92015-12-02 13:20:03 +0800239 if (!vp.IsGetting())
240 return FALSE;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800241#ifdef PDF_ENABLE_XFA
Jun Fang487d1a92015-12-02 13:20:03 +0800242 CPDFDoc_Environment* pEnv =
243 static_cast<CJS_Context*>(cc)->GetJSRuntime()->GetReaderApp();
244 if (!pEnv)
245 return FALSE;
246 CFX_WideString language = pEnv->FFI_GetLanguage();
Tom Sepez4d6fa832015-12-08 11:31:59 -0800247 if (!language.IsEmpty()) {
Jun Fang487d1a92015-12-02 13:20:03 +0800248 vp << language;
Tom Sepez4d6fa832015-12-08 11:31:59 -0800249 return TRUE;
250 }
251#endif
252 vp << JS_STR_LANGUANGE;
Jun Fang487d1a92015-12-02 13:20:03 +0800253 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700254}
255
256// creates a new fdf object that contains no data
257// comment: need reader support
258// note:
259// CFDF_Document * CPDFDoc_Environment::NewFDF();
Tom Sepezba038bc2015-10-08 12:03:00 -0700260FX_BOOL app::newFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800261 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700262 CJS_Value& vRet,
263 CFX_WideString& sError) {
264 return TRUE;
265}
266// opens a specified pdf document and returns its document object
267// comment:need reader support
268// note: as defined in js reference, the proto of this function's fourth
269// parmeters, how old an fdf document while do not show it.
270// CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);
271
Tom Sepezba038bc2015-10-08 12:03:00 -0700272FX_BOOL app::openFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800273 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700274 CJS_Value& vRet,
275 CFX_WideString& sError) {
276 return TRUE;
277}
278
Tom Sepezba038bc2015-10-08 12:03:00 -0700279FX_BOOL app::alert(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800280 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700281 CJS_Value& vRet,
282 CFX_WideString& sError) {
Tom Sepezbd932572016-01-29 09:10:41 -0800283 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
Tom Sepez67fd5df2015-10-08 12:24:19 -0700284 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
Tom Sepezbd932572016-01-29 09:10:41 -0800285 std::vector<CJS_Value> newParams = JS_ExpandKeywordParams(
286 pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700287
Tom Sepezbd932572016-01-29 09:10:41 -0800288 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
289 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
290 return FALSE;
291 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700292
Tom Sepezbd932572016-01-29 09:10:41 -0800293 CFX_WideString swMsg;
294 if (newParams[0].GetType() == CJS_Value::VT_object) {
295 CJS_Array carray(pRuntime);
296 if (newParams[0].ConvertToArray(carray)) {
297 swMsg = L"[";
298 CJS_Value element(pRuntime);
299 for (int i = 0; i < carray.GetLength(); ++i) {
300 if (i)
301 swMsg += L", ";
302 carray.GetElement(i, element);
303 swMsg += element.ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700304 }
Tom Sepezbd932572016-01-29 09:10:41 -0800305 swMsg += L"]";
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700306 } else {
Tom Sepezbd932572016-01-29 09:10:41 -0800307 swMsg = newParams[0].ToCFXWideString();
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700308 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700309 } else {
Tom Sepezbd932572016-01-29 09:10:41 -0800310 swMsg = newParams[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700311 }
312
Tom Sepezbd932572016-01-29 09:10:41 -0800313 int iIcon = 0;
314 if (newParams[1].GetType() != CJS_Value::VT_unknown)
315 iIcon = newParams[1].ToInt();
316
317 int iType = 0;
318 if (newParams[2].GetType() != CJS_Value::VT_unknown)
319 iType = newParams[2].ToInt();
320
321 CFX_WideString swTitle;
322 if (newParams[3].GetType() != CJS_Value::VT_unknown)
323 swTitle = newParams[3].ToCFXWideString();
324 else
325 swTitle = JSGetStringFromID(pContext, IDS_STRING_JSALERT);
326
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700327 pRuntime->BeginBlock();
Lei Zhangd607f5b2015-10-05 17:06:09 -0700328 vRet = MsgBox(pRuntime->GetReaderApp(), swMsg.c_str(), swTitle.c_str(), iType,
329 iIcon);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330 pRuntime->EndBlock();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700331 return TRUE;
332}
333
Tom Sepezba038bc2015-10-08 12:03:00 -0700334FX_BOOL app::beep(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800335 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 CJS_Value& vRet,
337 CFX_WideString& sError) {
338 if (params.size() == 1) {
339 CJS_Context* pContext = (CJS_Context*)cc;
340 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
341 CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
342 pEnv->JS_appBeep(params[0].ToInt());
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700343 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700344 }
345
346 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
347 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348}
349
Tom Sepezba038bc2015-10-08 12:03:00 -0700350FX_BOOL app::findComponent(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800351 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352 CJS_Value& vRet,
353 CFX_WideString& sError) {
354 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700355}
356
Tom Sepezba038bc2015-10-08 12:03:00 -0700357FX_BOOL app::popUpMenuEx(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800358 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700359 CJS_Value& vRet,
360 CFX_WideString& sError) {
361 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700362}
363
Tom Sepezba038bc2015-10-08 12:03:00 -0700364FX_BOOL app::fs(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700365 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700366}
367
Tom Sepezba038bc2015-10-08 12:03:00 -0700368FX_BOOL app::setInterval(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800369 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700370 CJS_Value& vRet,
371 CFX_WideString& sError) {
372 CJS_Context* pContext = (CJS_Context*)cc;
373 if (params.size() > 2 || params.size() == 0) {
374 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
375 return FALSE;
376 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800377
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700378 CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L"";
379 if (script.IsEmpty()) {
380 sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700381 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700382 }
383
384 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
385 FX_DWORD dwInterval = params.size() > 1 ? params[1].ToInt() : 1000;
386
387 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
388 ASSERT(pApp);
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700389 CJS_Timer* pTimer =
390 new CJS_Timer(this, pApp, pRuntime, 0, script, dwInterval, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700391 m_aTimer.Add(pTimer);
392
Tom Sepez39bfe122015-09-17 15:25:23 -0700393 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700394 pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700395 CJS_TimerObj* pJS_TimerObj =
Tom Sepez39bfe122015-09-17 15:25:23 -0700396 (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700397 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700398 pTimerObj->SetTimer(pTimer);
399
400 vRet = pRetObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700402}
403
Tom Sepezba038bc2015-10-08 12:03:00 -0700404FX_BOOL app::setTimeOut(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800405 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700406 CJS_Value& vRet,
407 CFX_WideString& sError) {
408 if (params.size() > 2 || params.size() == 0) {
409 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
410 return FALSE;
411 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800412
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700413 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700414 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700415
416 CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L"";
417 if (script.IsEmpty()) {
418 sError =
419 JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
420 return TRUE;
421 }
422
423 FX_DWORD dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000;
424
425 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
426 ASSERT(pApp);
427
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700428 CJS_Timer* pTimer =
429 new CJS_Timer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700430 m_aTimer.Add(pTimer);
431
Tom Sepez39bfe122015-09-17 15:25:23 -0700432 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700433 pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700434 CJS_TimerObj* pJS_TimerObj =
Tom Sepez39bfe122015-09-17 15:25:23 -0700435 (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700436 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 pTimerObj->SetTimer(pTimer);
438
439 vRet = pRetObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700440 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700441}
442
Tom Sepezba038bc2015-10-08 12:03:00 -0700443FX_BOOL app::clearTimeOut(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800444 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445 CJS_Value& vRet,
446 CFX_WideString& sError) {
447 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700448 if (params.size() != 1) {
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700449 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700450 return FALSE;
451 }
452
Tom Sepez39bfe122015-09-17 15:25:23 -0700453 if (params[0].GetType() == CJS_Value::VT_fxobject) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700454 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700455 if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) {
456 if (CJS_Object* pJSObj = params[0].ToCJSObject()) {
457 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) {
458 if (CJS_Timer* pTimer = pTimerObj->GetTimer()) {
459 pTimer->KillJSTimer();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700460
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700461 for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) {
462 if (m_aTimer[i] == pTimer) {
463 m_aTimer.RemoveAt(i);
464 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700465 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700466 }
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700467
468 delete pTimer;
469 pTimerObj->SetTimer(NULL);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700470 }
471 }
472 }
473 }
474 }
475
476 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700477}
478
Tom Sepezba038bc2015-10-08 12:03:00 -0700479FX_BOOL app::clearInterval(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800480 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700481 CJS_Value& vRet,
482 CFX_WideString& sError) {
483 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700484 if (params.size() != 1) {
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700485 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700486 return FALSE;
487 }
488
Tom Sepez39bfe122015-09-17 15:25:23 -0700489 if (params[0].GetType() == CJS_Value::VT_fxobject) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700490 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700491 if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) {
492 if (CJS_Object* pJSObj = params[0].ToCJSObject()) {
493 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) {
494 if (CJS_Timer* pTimer = pTimerObj->GetTimer()) {
495 pTimer->KillJSTimer();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700497 for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) {
498 if (m_aTimer[i] == pTimer) {
499 m_aTimer.RemoveAt(i);
500 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700501 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700502 }
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700503
504 delete pTimer;
505 pTimerObj->SetTimer(NULL);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700506 }
507 }
508 }
509 }
510 }
511
512 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700513}
514
Tom Sepezba038bc2015-10-08 12:03:00 -0700515FX_BOOL app::execMenuItem(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800516 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517 CJS_Value& vRet,
518 CFX_WideString& sError) {
519 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700520}
521
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700522void app::TimerProc(CJS_Timer* pTimer) {
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700523 CJS_Runtime* pRuntime = pTimer->GetRuntime();
524
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700525 switch (pTimer->GetType()) {
526 case 0: // interval
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700527 if (pRuntime)
528 RunJsScript(pRuntime, pTimer->GetJScript());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700529 break;
530 case 1:
531 if (pTimer->GetTimeOut() > 0) {
Lei Zhang2d5a0e12015-10-05 17:00:03 -0700532 if (pRuntime)
533 RunJsScript(pRuntime, pTimer->GetJScript());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700534 pTimer->KillJSTimer();
535 }
536 break;
537 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700538}
539
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700540void app::RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700541 if (!pRuntime->IsBlocking()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700542 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700543 pContext->OnExternal_Exec();
544 CFX_WideString wtInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700545 pContext->RunScript(wsScript, &wtInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700546 pRuntime->ReleaseContext(pContext);
547 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700548}
549
Tom Sepezba038bc2015-10-08 12:03:00 -0700550FX_BOOL app::goBack(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800551 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700552 CJS_Value& vRet,
553 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800554 // Not supported.
555 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700556}
557
Tom Sepezba038bc2015-10-08 12:03:00 -0700558FX_BOOL app::goForward(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800559 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700560 CJS_Value& vRet,
561 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800562 // Not supported.
563 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700564}
565
Tom Sepezba038bc2015-10-08 12:03:00 -0700566FX_BOOL app::mailMsg(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800567 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700568 CJS_Value& vRet,
569 CFX_WideString& sError) {
Tom Sepez67fd5df2015-10-08 12:24:19 -0700570 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
571 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800572 std::vector<CJS_Value> newParams =
573 JS_ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc",
574 L"cBcc", L"cSubject", L"cMsg");
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700575
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800576 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
577 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
578 return FALSE;
579 }
580 bool bUI = newParams[0].ToBool();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700581
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800582 CFX_WideString cTo;
583 if (newParams[1].GetType() != CJS_Value::VT_unknown) {
584 cTo = newParams[1].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700585 } else {
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800586 if (!bUI) {
587 // cTo parameter required when UI not invoked.
588 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700589 return FALSE;
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800590 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700591 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800592
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800593 CFX_WideString cCc;
594 if (newParams[2].GetType() != CJS_Value::VT_unknown)
595 cCc = newParams[2].ToCFXWideString();
596
597 CFX_WideString cBcc;
598 if (newParams[3].GetType() != CJS_Value::VT_unknown)
599 cBcc = newParams[3].ToCFXWideString();
600
601 CFX_WideString cSubject;
602 if (newParams[4].GetType() != CJS_Value::VT_unknown)
603 cSubject = newParams[4].ToCFXWideString();
604
605 CFX_WideString cMsg;
606 if (newParams[5].GetType() != CJS_Value::VT_unknown)
607 cMsg = newParams[5].ToCFXWideString();
608
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700609 pRuntime->BeginBlock();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800610 pContext->GetReaderApp()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(),
Tom Sepez67fd5df2015-10-08 12:24:19 -0700611 cSubject.c_str(), cCc.c_str(),
612 cBcc.c_str(), cMsg.c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700613 pRuntime->EndBlock();
Tom Sepeze5fbd7a2016-01-29 17:05:08 -0800614 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700615}
616
Tom Sepezba038bc2015-10-08 12:03:00 -0700617FX_BOOL app::launchURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800618 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619 CJS_Value& vRet,
620 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800621 // Unsafe, not supported.
622 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700623}
624
Tom Sepezba038bc2015-10-08 12:03:00 -0700625FX_BOOL app::runtimeHighlight(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 CJS_PropValue& vp,
627 CFX_WideString& sError) {
628 if (vp.IsSetting()) {
629 vp >> m_bRuntimeHighLight;
630 } else {
631 vp << m_bRuntimeHighLight;
632 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700634}
635
Tom Sepezba038bc2015-10-08 12:03:00 -0700636FX_BOOL app::fullscreen(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700637 CJS_PropValue& vp,
638 CFX_WideString& sError) {
639 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700640}
641
Tom Sepezba038bc2015-10-08 12:03:00 -0700642FX_BOOL app::popUpMenu(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800643 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700644 CJS_Value& vRet,
645 CFX_WideString& sError) {
646 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700647}
648
Tom Sepezba038bc2015-10-08 12:03:00 -0700649FX_BOOL app::browseForDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800650 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700651 CJS_Value& vRet,
652 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800653 // Unsafe, not supported.
654 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700655}
656
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700657CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath) {
658 CFX_WideString sRet = L"/";
Tom Sepezc6ab1722015-02-05 15:27:25 -0800659
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700660 for (int i = 0, sz = sOldPath.GetLength(); i < sz; i++) {
661 wchar_t c = sOldPath.GetAt(i);
662 if (c == L':') {
663 } else {
664 if (c == L'\\') {
665 sRet += L"/";
666 } else {
667 sRet += c;
668 }
669 }
670 }
Tom Sepezc6ab1722015-02-05 15:27:25 -0800671
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700672 return sRet;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700673}
674
Tom Sepezba038bc2015-10-08 12:03:00 -0700675FX_BOOL app::newDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800676 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700677 CJS_Value& vRet,
678 CFX_WideString& sError) {
679 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700680}
681
Tom Sepezba038bc2015-10-08 12:03:00 -0700682FX_BOOL app::openDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800683 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700684 CJS_Value& vRet,
685 CFX_WideString& sError) {
686 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700687}
688
Tom Sepezba038bc2015-10-08 12:03:00 -0700689FX_BOOL app::response(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800690 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700691 CJS_Value& vRet,
692 CFX_WideString& sError) {
Tom Sepez58fb36a2016-02-01 10:32:14 -0800693 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
Tom Sepez67fd5df2015-10-08 12:24:19 -0700694 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
Tom Sepez58fb36a2016-02-01 10:32:14 -0800695 std::vector<CJS_Value> newParams =
696 JS_ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle",
697 L"cDefault", L"bPassword", L"cLabel");
Tom Sepez621d4de2014-07-29 14:01:21 -0700698
Tom Sepez58fb36a2016-02-01 10:32:14 -0800699 if (newParams[0].GetType() == CJS_Value::VT_unknown) {
700 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
701 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700702 }
Tom Sepez58fb36a2016-02-01 10:32:14 -0800703 CFX_WideString swQuestion = newParams[0].ToCFXWideString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700704
Tom Sepez58fb36a2016-02-01 10:32:14 -0800705 CFX_WideString swTitle = L"PDF";
706 if (newParams[1].GetType() != CJS_Value::VT_unknown)
707 swTitle = newParams[1].ToCFXWideString();
708
709 CFX_WideString swDefault;
710 if (newParams[2].GetType() != CJS_Value::VT_unknown)
711 swDefault = newParams[2].ToCFXWideString();
712
713 bool bPassword = false;
714 if (newParams[3].GetType() != CJS_Value::VT_unknown)
715 bPassword = newParams[3].ToBool();
716
717 CFX_WideString swLabel;
718 if (newParams[4].GetType() != CJS_Value::VT_unknown)
719 swLabel = newParams[4].ToCFXWideString();
Tom Sepez621d4de2014-07-29 14:01:21 -0700720
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700721 const int MAX_INPUT_BYTES = 2048;
Lei Zhangaa8bf7e2015-12-24 19:13:32 -0800722 std::unique_ptr<char[]> pBuff(new char[MAX_INPUT_BYTES + 2]);
Lei Zhangdb5256f2015-10-02 10:11:43 -0700723 memset(pBuff.get(), 0, MAX_INPUT_BYTES + 2);
Tom Sepez58fb36a2016-02-01 10:32:14 -0800724
725 int nLengthBytes = pContext->GetReaderApp()->JS_appResponse(
Lei Zhangdb5256f2015-10-02 10:11:43 -0700726 swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(), swLabel.c_str(),
Tom Sepez58fb36a2016-02-01 10:32:14 -0800727 bPassword, pBuff.get(), MAX_INPUT_BYTES);
728
729 if (nLengthBytes < 0 || nLengthBytes > MAX_INPUT_BYTES) {
730 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700731 return FALSE;
732 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700733
Tom Sepez58fb36a2016-02-01 10:32:14 -0800734 vRet = CFX_WideString::FromUTF16LE(reinterpret_cast<uint16_t*>(pBuff.get()),
735 nLengthBytes / sizeof(uint16_t))
736 .c_str();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700737 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700738}
739
Tom Sepezba038bc2015-10-08 12:03:00 -0700740FX_BOOL app::media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700741 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700742}
743
Tom Sepezba038bc2015-10-08 12:03:00 -0700744FX_BOOL app::execDialog(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800745 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700746 CJS_Value& vRet,
747 CFX_WideString& sError) {
748 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700749}