blob: 75cd2ec251c2da42dac14af3ef2eda15fd9c10dd [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/Document.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07008
Dan Sinclair3ebd1212016-03-09 09:59:23 -05009#include <vector>
10
dan sinclair61b2fc72016-03-23 19:21:44 -040011#include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
Dan Sinclair455a4192016-03-16 09:48:56 -040012#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
Dan Sinclairaa403d32016-03-15 14:57:22 -040013#include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
Dan Sinclair3ebd1212016-03-09 09:59:23 -050014#include "fpdfsdk/include/fsdk_mgr.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040015#include "fpdfsdk/javascript/Field.h"
16#include "fpdfsdk/javascript/Icon.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040017#include "fpdfsdk/javascript/JS_Define.h"
18#include "fpdfsdk/javascript/JS_EventHandler.h"
19#include "fpdfsdk/javascript/JS_Object.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040020#include "fpdfsdk/javascript/JS_Value.h"
21#include "fpdfsdk/javascript/app.h"
dsinclair64376be2016-03-31 20:03:24 -070022#include "fpdfsdk/javascript/cjs_context.h"
23#include "fpdfsdk/javascript/cjs_runtime.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040024#include "fpdfsdk/javascript/resource.h"
Lei Zhang8241df72015-11-06 14:38:48 -080025#include "third_party/base/numerics/safe_math.h"
Chris Palmer9108ad22014-06-26 16:01:46 -070026
Tom Sepezba038bc2015-10-08 12:03:00 -070027static v8::Isolate* GetIsolate(IJS_Context* cc) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070028 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070029 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070030 return pRuntime->GetIsolate();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070031}
32
33BEGIN_JS_STATIC_CONST(CJS_PrintParamsObj)
34END_JS_STATIC_CONST()
35
36BEGIN_JS_STATIC_PROP(CJS_PrintParamsObj)
37END_JS_STATIC_PROP()
38
39BEGIN_JS_STATIC_METHOD(CJS_PrintParamsObj)
40END_JS_STATIC_METHOD()
41
42IMPLEMENT_JS_CLASS(CJS_PrintParamsObj, PrintParamsObj)
43
44PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070045 : CJS_EmbedObj(pJSObject) {
46 bUI = TRUE;
47 nStart = 0;
48 nEnd = 0;
49 bSilent = FALSE;
50 bShrinkToFit = FALSE;
51 bPrintAsImage = FALSE;
52 bReverse = FALSE;
53 bAnnotations = TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070054}
55
Nico Weber9d8ec5a2015-08-04 13:00:21 -070056#define MINWIDTH 5.0f
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070057#define MINHEIGHT 5.0f
58
59BEGIN_JS_STATIC_CONST(CJS_Document)
60END_JS_STATIC_CONST()
61
62BEGIN_JS_STATIC_PROP(CJS_Document)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070063JS_STATIC_PROP_ENTRY(ADBE)
64JS_STATIC_PROP_ENTRY(author)
65JS_STATIC_PROP_ENTRY(baseURL)
66JS_STATIC_PROP_ENTRY(bookmarkRoot)
67JS_STATIC_PROP_ENTRY(calculate)
68JS_STATIC_PROP_ENTRY(Collab)
69JS_STATIC_PROP_ENTRY(creationDate)
70JS_STATIC_PROP_ENTRY(creator)
71JS_STATIC_PROP_ENTRY(delay)
72JS_STATIC_PROP_ENTRY(dirty)
73JS_STATIC_PROP_ENTRY(documentFileName)
74JS_STATIC_PROP_ENTRY(external)
75JS_STATIC_PROP_ENTRY(filesize)
76JS_STATIC_PROP_ENTRY(icons)
77JS_STATIC_PROP_ENTRY(info)
78JS_STATIC_PROP_ENTRY(keywords)
79JS_STATIC_PROP_ENTRY(layout)
80JS_STATIC_PROP_ENTRY(media)
81JS_STATIC_PROP_ENTRY(modDate)
82JS_STATIC_PROP_ENTRY(mouseX)
83JS_STATIC_PROP_ENTRY(mouseY)
84JS_STATIC_PROP_ENTRY(numFields)
85JS_STATIC_PROP_ENTRY(numPages)
86JS_STATIC_PROP_ENTRY(pageNum)
87JS_STATIC_PROP_ENTRY(pageWindowRect)
88JS_STATIC_PROP_ENTRY(path)
89JS_STATIC_PROP_ENTRY(producer)
90JS_STATIC_PROP_ENTRY(subject)
91JS_STATIC_PROP_ENTRY(title)
92JS_STATIC_PROP_ENTRY(zoom)
93JS_STATIC_PROP_ENTRY(zoomType)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070094END_JS_STATIC_PROP()
95
96BEGIN_JS_STATIC_METHOD(CJS_Document)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070097JS_STATIC_METHOD_ENTRY(addAnnot)
98JS_STATIC_METHOD_ENTRY(addField)
99JS_STATIC_METHOD_ENTRY(addLink)
100JS_STATIC_METHOD_ENTRY(addIcon)
101JS_STATIC_METHOD_ENTRY(calculateNow)
102JS_STATIC_METHOD_ENTRY(closeDoc)
103JS_STATIC_METHOD_ENTRY(createDataObject)
104JS_STATIC_METHOD_ENTRY(deletePages)
105JS_STATIC_METHOD_ENTRY(exportAsText)
106JS_STATIC_METHOD_ENTRY(exportAsFDF)
107JS_STATIC_METHOD_ENTRY(exportAsXFDF)
108JS_STATIC_METHOD_ENTRY(extractPages)
109JS_STATIC_METHOD_ENTRY(getAnnot)
110JS_STATIC_METHOD_ENTRY(getAnnots)
111JS_STATIC_METHOD_ENTRY(getAnnot3D)
112JS_STATIC_METHOD_ENTRY(getAnnots3D)
113JS_STATIC_METHOD_ENTRY(getField)
114JS_STATIC_METHOD_ENTRY(getIcon)
115JS_STATIC_METHOD_ENTRY(getLinks)
116JS_STATIC_METHOD_ENTRY(getNthFieldName)
117JS_STATIC_METHOD_ENTRY(getOCGs)
118JS_STATIC_METHOD_ENTRY(getPageBox)
119JS_STATIC_METHOD_ENTRY(getPageNthWord)
120JS_STATIC_METHOD_ENTRY(getPageNthWordQuads)
121JS_STATIC_METHOD_ENTRY(getPageNumWords)
122JS_STATIC_METHOD_ENTRY(getPrintParams)
123JS_STATIC_METHOD_ENTRY(getURL)
124JS_STATIC_METHOD_ENTRY(importAnFDF)
125JS_STATIC_METHOD_ENTRY(importAnXFDF)
126JS_STATIC_METHOD_ENTRY(importTextData)
127JS_STATIC_METHOD_ENTRY(insertPages)
128JS_STATIC_METHOD_ENTRY(mailForm)
129JS_STATIC_METHOD_ENTRY(print)
130JS_STATIC_METHOD_ENTRY(removeField)
131JS_STATIC_METHOD_ENTRY(replacePages)
132JS_STATIC_METHOD_ENTRY(resetForm)
133JS_STATIC_METHOD_ENTRY(removeIcon)
134JS_STATIC_METHOD_ENTRY(saveAs)
135JS_STATIC_METHOD_ENTRY(submitForm)
136JS_STATIC_METHOD_ENTRY(mailDoc)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700137END_JS_STATIC_METHOD()
138
139IMPLEMENT_JS_CLASS(CJS_Document, Document)
140
Tom Sepez33420902015-10-13 15:00:10 -0700141void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) {
142 CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
143 Document* pDoc = static_cast<Document*>(GetEmbedObject());
144 pDoc->AttachDoc(pRuntime->GetReaderDocument());
145 pDoc->SetIsolate(pRuntime->GetIsolate());
146}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700148Document::Document(CJS_Object* pJSObject)
149 : CJS_EmbedObj(pJSObject),
150 m_isolate(NULL),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700151 m_pDocument(NULL),
152 m_cwBaseURL(L""),
153 m_bDelay(FALSE) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700154
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700155Document::~Document() {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700156}
157
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700158// the total number of fileds in document.
Tom Sepezba038bc2015-10-08 12:03:00 -0700159FX_BOOL Document::numFields(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700160 CJS_PropValue& vp,
161 CFX_WideString& sError) {
162 if (vp.IsSetting()) {
163 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
164 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700165 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700166 }
167 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
168 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
169 vp << (int)pPDFForm->CountFields();
170 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700171}
172
Tom Sepezba038bc2015-10-08 12:03:00 -0700173FX_BOOL Document::dirty(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700174 CJS_PropValue& vp,
175 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700176 if (vp.IsGetting()) {
177 if (m_pDocument->GetChangeMark())
178 vp << true;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700179 else
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700180 vp << false;
181 } else {
182 bool bChanged = false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700183
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184 vp >> bChanged;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700185
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700186 if (bChanged)
187 m_pDocument->SetChangeMark();
188 else
189 m_pDocument->ClearChangeMark();
190 }
191
192 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700193}
194
Tom Sepezba038bc2015-10-08 12:03:00 -0700195FX_BOOL Document::ADBE(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700196 CJS_PropValue& vp,
197 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700198 if (vp.IsGetting()) {
199 vp.SetNull();
200 } else {
201 }
202
203 return TRUE;
204}
205
Tom Sepezba038bc2015-10-08 12:03:00 -0700206FX_BOOL Document::pageNum(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 CJS_PropValue& vp,
208 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700209 if (vp.IsGetting()) {
210 if (CPDFSDK_PageView* pPageView = m_pDocument->GetCurrentView()) {
211 vp << pPageView->GetPageIndex();
212 }
213 } else {
214 int iPageCount = m_pDocument->GetPageCount();
215 int iPageNum = 0;
216 vp >> iPageNum;
217
218 CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
219 if (iPageNum >= 0 && iPageNum < iPageCount) {
220 pEnv->JS_docgotoPage(iPageNum);
221 } else if (iPageNum >= iPageCount) {
222 pEnv->JS_docgotoPage(iPageCount - 1);
223 } else if (iPageNum < 0) {
224 pEnv->JS_docgotoPage(0);
225 }
226 }
227
228 return TRUE;
229}
230
Tom Sepezba038bc2015-10-08 12:03:00 -0700231FX_BOOL Document::addAnnot(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800232 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700233 CJS_Value& vRet,
234 CFX_WideString& sError) {
235 // Not supported.
236 return TRUE;
237}
238
Tom Sepezba038bc2015-10-08 12:03:00 -0700239FX_BOOL Document::addField(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800240 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700241 CJS_Value& vRet,
242 CFX_WideString& sError) {
243 // Not supported.
244 return TRUE;
245}
246
Tom Sepezba038bc2015-10-08 12:03:00 -0700247FX_BOOL Document::exportAsText(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800248 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700249 CJS_Value& vRet,
250 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -0800251 // Unsafe, not supported.
252 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700253}
254
Tom Sepezba038bc2015-10-08 12:03:00 -0700255FX_BOOL Document::exportAsFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800256 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257 CJS_Value& vRet,
258 CFX_WideString& sError) {
259 // Unsafe, not supported.
260 return TRUE;
261}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700262
Tom Sepezba038bc2015-10-08 12:03:00 -0700263FX_BOOL Document::exportAsXFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800264 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265 CJS_Value& vRet,
266 CFX_WideString& sError) {
267 // Unsafe, not supported.
268 return TRUE;
269}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700270
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700271// Maps a field object in PDF document to a JavaScript variable
272// comment:
273// note: the paremter cName, this is clue how to treat if the cName is not a
274// valiable filed name in this document
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700275
Tom Sepezba038bc2015-10-08 12:03:00 -0700276FX_BOOL Document::getField(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800277 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700278 CJS_Value& vRet,
279 CFX_WideString& sError) {
280 CJS_Context* pContext = (CJS_Context*)cc;
281 if (params.size() < 1) {
282 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
283 return FALSE;
284 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700285
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700286 CFX_WideString wideName = params[0].ToCFXWideString();
287
288 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
289 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
290 if (pPDFForm->CountFields(wideName) <= 0) {
291 vRet.SetNull();
292 return TRUE;
293 }
294
295 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700296 v8::Local<v8::Object> pFieldObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -0700297 pRuntime->GetIsolate(), pRuntime, CJS_Field::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700298
299 v8::Isolate* isolate = GetIsolate(cc);
Tom Sepez39bfe122015-09-17 15:25:23 -0700300 CJS_Field* pJSField = (CJS_Field*)FXJS_GetPrivate(isolate, pFieldObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700301 Field* pField = (Field*)pJSField->GetEmbedObject();
302 pField->AttachField(this, wideName);
303
304 vRet = pJSField;
305 return TRUE;
306}
307
308// Gets the name of the nth field in the document
Tom Sepezba038bc2015-10-08 12:03:00 -0700309FX_BOOL Document::getNthFieldName(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800310 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700311 CJS_Value& vRet,
312 CFX_WideString& sError) {
313 CJS_Context* pContext = (CJS_Context*)cc;
314 if (params.size() != 1) {
315 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
316 return FALSE;
317 }
318
319 int nIndex = params[0].ToInt();
320 if (nIndex < 0) {
321 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
322 return FALSE;
323 }
324
325 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
326 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
327 CPDF_FormField* pField = pPDFForm->GetField(nIndex);
328 if (!pField)
329 return FALSE;
330
331 vRet = pField->GetFullName().c_str();
332 return TRUE;
333}
334
Tom Sepezba038bc2015-10-08 12:03:00 -0700335FX_BOOL Document::importAnFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800336 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700337 CJS_Value& vRet,
338 CFX_WideString& sError) {
339 // Unsafe, not supported.
340 return TRUE;
341}
342
Tom Sepezba038bc2015-10-08 12:03:00 -0700343FX_BOOL Document::importAnXFDF(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800344 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345 CJS_Value& vRet,
346 CFX_WideString& sError) {
347 // Unsafe, not supported.
348 return TRUE;
349}
350
Tom Sepezba038bc2015-10-08 12:03:00 -0700351FX_BOOL Document::importTextData(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800352 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700353 CJS_Value& vRet,
354 CFX_WideString& sError) {
355 // Unsafe, not supported.
356 return TRUE;
357}
358
359// exports the form data and mails the resulting fdf file as an attachment to
360// all recipients.
361// comment: need reader supports
362// note:
363// int CPDFSDK_Document::mailForm(FX_BOOL bUI,String cto,string ccc,string
364// cbcc,string cSubject,string cms);
365
Tom Sepezba038bc2015-10-08 12:03:00 -0700366FX_BOOL Document::mailForm(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800367 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700368 CJS_Value& vRet,
369 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700370 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
371 return FALSE;
372
373 int iLength = params.size();
374
375 FX_BOOL bUI = iLength > 0 ? params[0].ToBool() : TRUE;
376 CFX_WideString cTo = iLength > 1 ? params[1].ToCFXWideString() : L"";
377 CFX_WideString cCc = iLength > 2 ? params[2].ToCFXWideString() : L"";
378 CFX_WideString cBcc = iLength > 3 ? params[3].ToCFXWideString() : L"";
379 CFX_WideString cSubject = iLength > 4 ? params[4].ToCFXWideString() : L"";
380 CFX_WideString cMsg = iLength > 5 ? params[5].ToCFXWideString() : L"";
381
382 CPDFSDK_InterForm* pInterForm =
383 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700384 CFX_ByteTextBuf textBuf;
385 if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
386 return FALSE;
387
388 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700389 CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700390 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700391
392 pRuntime->BeginBlock();
393 pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI,
394 cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(),
395 cMsg.c_str());
396 pRuntime->EndBlock();
397 return TRUE;
398}
399
Tom Sepezba038bc2015-10-08 12:03:00 -0700400FX_BOOL Document::print(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800401 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700402 CJS_Value& vRet,
403 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700404 FX_BOOL bUI = TRUE;
405 int nStart = 0;
406 int nEnd = 0;
407 FX_BOOL bSilent = FALSE;
408 FX_BOOL bShrinkToFit = FALSE;
409 FX_BOOL bPrintAsImage = FALSE;
410 FX_BOOL bReverse = FALSE;
411 FX_BOOL bAnnotations = FALSE;
412
413 int nlength = params.size();
414 if (nlength == 9) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700415 if (params[8].GetType() == CJS_Value::VT_fxobject) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700416 v8::Local<v8::Object> pObj = params[8].ToV8Object();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700417 {
Tom Sepezcd56a7d2015-10-06 11:45:28 -0700418 if (FXJS_GetObjDefnID(pObj) == CJS_PrintParamsObj::g_nObjDefnID) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700419 if (CJS_Object* pJSObj = params[8].ToCJSObject()) {
420 if (PrintParamsObj* pprintparamsObj =
421 (PrintParamsObj*)pJSObj->GetEmbedObject()) {
422 bUI = pprintparamsObj->bUI;
423 nStart = pprintparamsObj->nStart;
424 nEnd = pprintparamsObj->nEnd;
425 bSilent = pprintparamsObj->bSilent;
426 bShrinkToFit = pprintparamsObj->bShrinkToFit;
427 bPrintAsImage = pprintparamsObj->bPrintAsImage;
428 bReverse = pprintparamsObj->bReverse;
429 bAnnotations = pprintparamsObj->bAnnotations;
430 }
431 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700432 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433 }
434 }
435 } else {
436 if (nlength >= 1)
437 bUI = params[0].ToBool();
438 if (nlength >= 2)
439 nStart = params[1].ToInt();
440 if (nlength >= 3)
441 nEnd = params[2].ToInt();
442 if (nlength >= 4)
443 bSilent = params[3].ToBool();
444 if (nlength >= 5)
445 bShrinkToFit = params[4].ToBool();
446 if (nlength >= 6)
447 bPrintAsImage = params[5].ToBool();
448 if (nlength >= 7)
449 bReverse = params[6].ToBool();
450 if (nlength >= 8)
451 bAnnotations = params[7].ToBool();
452 }
453
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700454 if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv()) {
455 pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage,
456 bReverse, bAnnotations);
457 return TRUE;
458 }
459 return FALSE;
460}
461
462// removes the specified field from the document.
463// comment:
464// note: if the filed name is not retional, adobe is dumb for it.
465
Tom Sepezba038bc2015-10-08 12:03:00 -0700466FX_BOOL Document::removeField(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800467 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468 CJS_Value& vRet,
469 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700470 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
471 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM)))
472 return FALSE;
473
474 CJS_Context* pContext = (CJS_Context*)cc;
475 if (params.size() != 1) {
476 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
477 return FALSE;
478 }
479
480 CFX_WideString sFieldName = params[0].ToCFXWideString();
481 CPDFSDK_InterForm* pInterForm =
482 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700483
Lei Zhangd88a3642015-11-10 09:38:57 -0800484 std::vector<CPDFSDK_Widget*> widgets;
485 pInterForm->GetWidgets(sFieldName, &widgets);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700486
Lei Zhangd88a3642015-11-10 09:38:57 -0800487 if (widgets.empty())
488 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700489
Lei Zhangd88a3642015-11-10 09:38:57 -0800490 for (CPDFSDK_Widget* pWidget : widgets) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800491 CFX_FloatRect rcAnnot = pWidget->GetRect();
Lei Zhangd88a3642015-11-10 09:38:57 -0800492 --rcAnnot.left;
493 --rcAnnot.bottom;
494 ++rcAnnot.right;
495 ++rcAnnot.top;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496
Lei Zhangd88a3642015-11-10 09:38:57 -0800497 CFX_RectArray aRefresh;
498 aRefresh.Add(rcAnnot);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700499
Tom Sepez50d12ad2015-11-24 09:50:51 -0800500 UnderlyingPageType* pPage = pWidget->GetUnderlyingPage();
Lei Zhangd88a3642015-11-10 09:38:57 -0800501 ASSERT(pPage);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700502
Lei Zhangd88a3642015-11-10 09:38:57 -0800503 CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage);
504 pPageView->DeleteAnnot(pWidget);
505 pPageView->UpdateRects(aRefresh);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700506 }
Lei Zhangd88a3642015-11-10 09:38:57 -0800507 m_pDocument->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700508
509 return TRUE;
510}
511
512// reset filed values within a document.
513// comment:
514// note: if the fields names r not rational, aodbe is dumb for it.
515
Tom Sepezba038bc2015-10-08 12:03:00 -0700516FX_BOOL Document::resetForm(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800517 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700518 CJS_Value& vRet,
519 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700520 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
521 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
522 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
523 return FALSE;
524
525 CPDFSDK_InterForm* pInterForm =
526 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700527 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700528 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
529 CJS_Array aName(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700530
Lei Zhangdd734de2015-11-11 10:16:52 -0800531 if (params.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700532 pPDFForm->ResetForm(TRUE);
533 m_pDocument->SetChangeMark();
Lei Zhangd88a3642015-11-10 09:38:57 -0800534 return TRUE;
535 }
536
537 switch (params[0].GetType()) {
538 default:
539 aName.Attach(params[0].ToV8Array());
540 break;
541 case CJS_Value::VT_string:
542 aName.SetElement(0, params[0]);
543 break;
544 }
545
546 std::vector<CPDF_FormField*> aFields;
547 for (int i = 0, isz = aName.GetLength(); i < isz; ++i) {
548 CJS_Value valElement(pRuntime);
549 aName.GetElement(i, valElement);
550 CFX_WideString swVal = valElement.ToCFXWideString();
551 for (int j = 0, jsz = pPDFForm->CountFields(swVal); j < jsz; ++j)
552 aFields.push_back(pPDFForm->GetField(j, swVal));
553 }
554
555 if (!aFields.empty()) {
556 pPDFForm->ResetForm(aFields, TRUE, TRUE);
557 m_pDocument->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700558 }
559
560 return TRUE;
561}
562
Tom Sepezba038bc2015-10-08 12:03:00 -0700563FX_BOOL Document::saveAs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800564 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700565 CJS_Value& vRet,
566 CFX_WideString& sError) {
567 // Unsafe, not supported.
568 return TRUE;
569}
570
Tom Sepezba038bc2015-10-08 12:03:00 -0700571FX_BOOL Document::submitForm(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800572 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700573 CJS_Value& vRet,
574 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700575 CJS_Context* pContext = (CJS_Context*)cc;
576 int nSize = params.size();
577 if (nSize < 1) {
578 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
579 return FALSE;
580 }
581
Tom Sepez67fd5df2015-10-08 12:24:19 -0700582 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
583 v8::Isolate* isolate = pRuntime->GetIsolate();
584 CJS_Array aFields(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700585 CFX_WideString strURL;
586 FX_BOOL bFDF = TRUE;
587 FX_BOOL bEmpty = FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700588
589 CJS_Value v = params[0];
Tom Sepez39bfe122015-09-17 15:25:23 -0700590 if (v.GetType() == CJS_Value::VT_string) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700591 strURL = params[0].ToCFXWideString();
592 if (nSize > 1)
593 bFDF = params[1].ToBool();
594 if (nSize > 2)
595 bEmpty = params[2].ToBool();
596 if (nSize > 3)
597 aFields.Attach(params[3].ToV8Array());
Tom Sepez39bfe122015-09-17 15:25:23 -0700598 } else if (v.GetType() == CJS_Value::VT_object) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700599 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Tom Sepez39bfe122015-09-17 15:25:23 -0700600 v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"cURL");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700601 if (!pValue.IsEmpty())
602 strURL =
Tom Sepez67fd5df2015-10-08 12:24:19 -0700603 CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
604
Tom Sepez39bfe122015-09-17 15:25:23 -0700605 pValue = FXJS_GetObjectElement(isolate, pObj, L"bFDF");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700606 bFDF = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToBool();
607
Tom Sepez39bfe122015-09-17 15:25:23 -0700608 pValue = FXJS_GetObjectElement(isolate, pObj, L"bEmpty");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700609 bEmpty = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToBool();
610
Tom Sepez39bfe122015-09-17 15:25:23 -0700611 pValue = FXJS_GetObjectElement(isolate, pObj, L"aFields");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700612 aFields.Attach(
Tom Sepez67fd5df2015-10-08 12:24:19 -0700613 CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToV8Array());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700614 }
615
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700616 CPDFSDK_InterForm* pInterForm =
617 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
618 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
Tom Sepez007e6c02016-02-26 14:31:56 -0800619 if (aFields.GetLength() == 0 && bEmpty) {
Lei Zhangd88a3642015-11-10 09:38:57 -0800620 if (pPDFInterForm->CheckRequiredFields(nullptr, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700621 pRuntime->BeginBlock();
622 pInterForm->SubmitForm(strURL, FALSE);
623 pRuntime->EndBlock();
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700624 }
625 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 }
627
Lei Zhangd88a3642015-11-10 09:38:57 -0800628 std::vector<CPDF_FormField*> fieldObjects;
629 for (int i = 0, sz = aFields.GetLength(); i < sz; ++i) {
Tom Sepez67fd5df2015-10-08 12:24:19 -0700630 CJS_Value valName(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700631 aFields.GetElement(i, valName);
632
633 CFX_WideString sName = valName.ToCFXWideString();
634 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
635 for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j) {
636 CPDF_FormField* pField = pPDFForm->GetField(j, sName);
637 if (!bEmpty && pField->GetValue().IsEmpty())
638 continue;
639
Lei Zhangd88a3642015-11-10 09:38:57 -0800640 fieldObjects.push_back(pField);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700641 }
642 }
643
Lei Zhangd88a3642015-11-10 09:38:57 -0800644 if (pPDFInterForm->CheckRequiredFields(&fieldObjects, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700645 pRuntime->BeginBlock();
Wei Li97da9762016-03-11 17:00:48 -0800646 pInterForm->SubmitFields(strURL, fieldObjects, true, !bFDF);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700647 pRuntime->EndBlock();
648 }
649 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700650}
651
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700652void Document::AttachDoc(CPDFSDK_Document* pDoc) {
653 m_pDocument = pDoc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700654}
655
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700656CPDFSDK_Document* Document::GetReaderDoc() {
657 return m_pDocument;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700658}
659
Tom Sepezba038bc2015-10-08 12:03:00 -0700660FX_BOOL Document::bookmarkRoot(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700661 CJS_PropValue& vp,
662 CFX_WideString& sError) {
663 return TRUE;
664}
665
Tom Sepezba038bc2015-10-08 12:03:00 -0700666FX_BOOL Document::mailDoc(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) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700670 FX_BOOL bUI = TRUE;
671 CFX_WideString cTo = L"";
672 CFX_WideString cCc = L"";
673 CFX_WideString cBcc = L"";
674 CFX_WideString cSubject = L"";
675 CFX_WideString cMsg = L"";
676
677 if (params.size() >= 1)
678 bUI = params[0].ToBool();
679 if (params.size() >= 2)
680 cTo = params[1].ToCFXWideString();
681 if (params.size() >= 3)
682 cCc = params[2].ToCFXWideString();
683 if (params.size() >= 4)
684 cBcc = params[3].ToCFXWideString();
685 if (params.size() >= 5)
686 cSubject = params[4].ToCFXWideString();
687 if (params.size() >= 6)
688 cMsg = params[5].ToCFXWideString();
689
Tom Sepez67fd5df2015-10-08 12:24:19 -0700690 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
691 v8::Isolate* isolate = pRuntime->GetIsolate();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700692
Tom Sepez39bfe122015-09-17 15:25:23 -0700693 if (params.size() >= 1 && params[0].GetType() == CJS_Value::VT_object) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700694 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700695
Tom Sepez39bfe122015-09-17 15:25:23 -0700696 v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"bUI");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700697 bUI = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToInt();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700698
Tom Sepez39bfe122015-09-17 15:25:23 -0700699 pValue = FXJS_GetObjectElement(isolate, pObj, L"cTo");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700700 cTo = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700701
Tom Sepez39bfe122015-09-17 15:25:23 -0700702 pValue = FXJS_GetObjectElement(isolate, pObj, L"cCc");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700703 cCc = CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700704
Tom Sepez39bfe122015-09-17 15:25:23 -0700705 pValue = FXJS_GetObjectElement(isolate, pObj, L"cBcc");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700706 cBcc =
707 CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700708
Tom Sepez39bfe122015-09-17 15:25:23 -0700709 pValue = FXJS_GetObjectElement(isolate, pObj, L"cSubject");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700710 cSubject =
Tom Sepez67fd5df2015-10-08 12:24:19 -0700711 CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700712
Tom Sepez39bfe122015-09-17 15:25:23 -0700713 pValue = FXJS_GetObjectElement(isolate, pObj, L"cMsg");
Tom Sepez67fd5df2015-10-08 12:24:19 -0700714 cMsg =
715 CJS_Value(pRuntime, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700716 }
717
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700718 pRuntime->BeginBlock();
719 CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
720 pEnv->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(),
721 cBcc.c_str(), cMsg.c_str());
722 pRuntime->EndBlock();
723
724 return TRUE;
725}
726
Tom Sepezba038bc2015-10-08 12:03:00 -0700727FX_BOOL Document::author(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700728 CJS_PropValue& vp,
729 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800730 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700731 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700732 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700733
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700734 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800735 vp << pDictionary->GetUnicodeTextBy("Author");
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700736 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700737 } else {
738 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
739 return FALSE;
740
741 CFX_WideString csAuthor;
742 vp >> csAuthor;
743 pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
744 m_pDocument->SetChangeMark();
745 return TRUE;
746 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700747}
748
Tom Sepezba038bc2015-10-08 12:03:00 -0700749FX_BOOL Document::info(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700750 CJS_PropValue& vp,
751 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800752 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700753 if (!pDictionary)
754 return FALSE;
Tom Sepezc6ab1722015-02-05 15:27:25 -0800755
Wei Li9b761132016-01-29 15:44:20 -0800756 CFX_WideString cwAuthor = pDictionary->GetUnicodeTextBy("Author");
757 CFX_WideString cwTitle = pDictionary->GetUnicodeTextBy("Title");
758 CFX_WideString cwSubject = pDictionary->GetUnicodeTextBy("Subject");
759 CFX_WideString cwKeywords = pDictionary->GetUnicodeTextBy("Keywords");
760 CFX_WideString cwCreator = pDictionary->GetUnicodeTextBy("Creator");
761 CFX_WideString cwProducer = pDictionary->GetUnicodeTextBy("Producer");
762 CFX_WideString cwCreationDate = pDictionary->GetUnicodeTextBy("CreationDate");
763 CFX_WideString cwModDate = pDictionary->GetUnicodeTextBy("ModDate");
764 CFX_WideString cwTrapped = pDictionary->GetUnicodeTextBy("Trapped");
Tom Sepezc6ab1722015-02-05 15:27:25 -0800765
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700766 v8::Isolate* isolate = GetIsolate(cc);
767 if (vp.IsGetting()) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700768 CJS_Context* pContext = (CJS_Context*)cc;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700769 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez808a99e2015-09-10 12:28:37 -0700770 v8::Local<v8::Object> pObj =
Tom Sepez33420902015-10-13 15:00:10 -0700771 FXJS_NewFxDynamicObj(pRuntime->GetIsolate(), pRuntime, -1);
Tom Sepez39bfe122015-09-17 15:25:23 -0700772 FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor.c_str());
773 FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle.c_str());
774 FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject.c_str());
775 FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords.c_str());
776 FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator.c_str());
777 FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer.c_str());
778 FXJS_PutObjectString(isolate, pObj, L"CreationDate",
779 cwCreationDate.c_str());
780 FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate.c_str());
781 FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped.c_str());
Tom Sepezc6ab1722015-02-05 15:27:25 -0800782
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700783 // It's to be compatible to non-standard info dictionary.
Oliver Chang3f1c71f2016-01-11 08:45:31 -0800784 for (const auto& it : *pDictionary) {
785 const CFX_ByteString& bsKey = it.first;
786 CPDF_Object* pValueObj = it.second;
tsepez6fe7d212016-04-06 10:51:14 -0700787 CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsByteStringC());
Dan Sinclair710c9092015-10-21 15:46:10 -0400788 if (pValueObj->IsString() || pValueObj->IsName()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700789 FXJS_PutObjectString(isolate, pObj, wsKey.c_str(),
790 pValueObj->GetUnicodeText().c_str());
Dan Sinclair710c9092015-10-21 15:46:10 -0400791 } else if (pValueObj->IsNumber()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700792 FXJS_PutObjectNumber(isolate, pObj, wsKey.c_str(),
793 (float)pValueObj->GetNumber());
Dan Sinclair710c9092015-10-21 15:46:10 -0400794 } else if (pValueObj->IsBoolean()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700795 FXJS_PutObjectBoolean(isolate, pObj, wsKey.c_str(),
Wei Li97da9762016-03-11 17:00:48 -0800796 !!pValueObj->GetInteger());
Dan Sinclair05d9e932015-10-20 16:44:57 -0400797 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700798 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700799 vp << pObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700800 }
Tom Sepezdfbf8e72015-10-14 14:17:26 -0700801 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700802}
803
Tom Sepezba038bc2015-10-08 12:03:00 -0700804FX_BOOL Document::creationDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700805 CJS_PropValue& vp,
806 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800807 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700808 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700809 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700810
811 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800812 vp << pDictionary->GetUnicodeTextBy("CreationDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700813 } else {
814 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
815 return FALSE;
816
817 CFX_WideString csCreationDate;
818 vp >> csCreationDate;
819 pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
820 m_pDocument->SetChangeMark();
821 }
822 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700823}
824
Tom Sepezba038bc2015-10-08 12:03:00 -0700825FX_BOOL Document::creator(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700826 CJS_PropValue& vp,
827 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800828 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700829 if (!pDictionary)
830 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -0700831
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700832 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800833 vp << pDictionary->GetUnicodeTextBy("Creator");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700834 } else {
835 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
836 return FALSE;
837
838 CFX_WideString csCreator;
839 vp >> csCreator;
840 pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
841 m_pDocument->SetChangeMark();
842 }
843 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700844}
845
Tom Sepezba038bc2015-10-08 12:03:00 -0700846FX_BOOL Document::delay(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700847 CJS_PropValue& vp,
848 CFX_WideString& sError) {
849 if (vp.IsGetting()) {
850 vp << m_bDelay;
851 } else {
852 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
853 return FALSE;
854
855 vp >> m_bDelay;
856 if (m_bDelay) {
Tom Sepez56c10192016-03-15 12:34:17 -0700857 m_DelayData.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700858 } else {
Tom Sepez56c10192016-03-15 12:34:17 -0700859 std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
860 DelayDataToProcess.swap(m_DelayData);
861 for (const auto& pData : DelayDataToProcess)
862 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700863 }
864 }
865 return TRUE;
866}
867
Tom Sepezba038bc2015-10-08 12:03:00 -0700868FX_BOOL Document::keywords(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700869 CJS_PropValue& vp,
870 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800871 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700872 if (!pDictionary)
873 return FALSE;
874
875 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800876 vp << pDictionary->GetUnicodeTextBy("Keywords");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700877 } else {
878 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
879 return FALSE;
880
881 CFX_WideString csKeywords;
882 vp >> csKeywords;
883 pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
884 m_pDocument->SetChangeMark();
885 }
886 return TRUE;
887}
888
Tom Sepezba038bc2015-10-08 12:03:00 -0700889FX_BOOL Document::modDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700890 CJS_PropValue& vp,
891 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800892 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700893 if (!pDictionary)
894 return FALSE;
895
896 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800897 vp << pDictionary->GetUnicodeTextBy("ModDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700898 } else {
899 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
900 return FALSE;
901
902 CFX_WideString csmodDate;
903 vp >> csmodDate;
904 pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
905 m_pDocument->SetChangeMark();
906 }
907 return TRUE;
908}
909
Tom Sepezba038bc2015-10-08 12:03:00 -0700910FX_BOOL Document::producer(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700911 CJS_PropValue& vp,
912 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800913 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700914 if (!pDictionary)
915 return FALSE;
916
917 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800918 vp << pDictionary->GetUnicodeTextBy("Producer");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700919 } else {
920 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
921 return FALSE;
922
923 CFX_WideString csproducer;
924 vp >> csproducer;
925 pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
926 m_pDocument->SetChangeMark();
927 }
928 return TRUE;
929}
930
Tom Sepezba038bc2015-10-08 12:03:00 -0700931FX_BOOL Document::subject(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700932 CJS_PropValue& vp,
933 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800934 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700935 if (!pDictionary)
936 return FALSE;
937
938 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800939 vp << pDictionary->GetUnicodeTextBy("Subject");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700940 } else {
941 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
942 return FALSE;
943
944 CFX_WideString cssubject;
945 vp >> cssubject;
946 pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
947 m_pDocument->SetChangeMark();
948 }
949 return TRUE;
950}
951
Tom Sepezba038bc2015-10-08 12:03:00 -0700952FX_BOOL Document::title(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700953 CJS_PropValue& vp,
954 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800955 if (!m_pDocument || !m_pDocument->GetUnderlyingDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700956 return FALSE;
957
Tom Sepez50d12ad2015-11-24 09:50:51 -0800958 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700959 if (!pDictionary)
960 return FALSE;
961
962 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800963 vp << pDictionary->GetUnicodeTextBy("Title");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700964 } else {
965 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
966 return FALSE;
967
968 CFX_WideString cstitle;
969 vp >> cstitle;
970 pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
971 m_pDocument->SetChangeMark();
972 }
973 return TRUE;
974}
975
Tom Sepezba038bc2015-10-08 12:03:00 -0700976FX_BOOL Document::numPages(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700977 CJS_PropValue& vp,
978 CFX_WideString& sError) {
979 if (vp.IsSetting()) {
980 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
981 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
982 return FALSE;
983 }
984 vp << m_pDocument->GetPageCount();
985 return TRUE;
986}
987
Tom Sepezba038bc2015-10-08 12:03:00 -0700988FX_BOOL Document::external(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700989 CJS_PropValue& vp,
990 CFX_WideString& sError) {
991 // In Chrome case,should always return true.
992 if (vp.IsGetting()) {
993 vp << true;
994 }
995 return TRUE;
996}
997
Tom Sepezba038bc2015-10-08 12:03:00 -0700998FX_BOOL Document::filesize(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700999 CJS_PropValue& vp,
1000 CFX_WideString& sError) {
1001 if (vp.IsSetting()) {
1002 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1003 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1004 return FALSE;
1005 }
1006 vp << 0;
1007 return TRUE;
1008}
1009
Tom Sepezba038bc2015-10-08 12:03:00 -07001010FX_BOOL Document::mouseX(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001011 CJS_PropValue& vp,
1012 CFX_WideString& sError) {
1013 return TRUE;
1014}
1015
Tom Sepezba038bc2015-10-08 12:03:00 -07001016FX_BOOL Document::mouseY(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001017 CJS_PropValue& vp,
1018 CFX_WideString& sError) {
1019 return TRUE;
1020}
1021
Tom Sepezba038bc2015-10-08 12:03:00 -07001022FX_BOOL Document::baseURL(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001023 CJS_PropValue& vp,
1024 CFX_WideString& sError) {
1025 if (vp.IsGetting()) {
1026 vp << m_cwBaseURL;
1027 } else {
1028 vp >> m_cwBaseURL;
1029 }
1030 return TRUE;
1031}
1032
Tom Sepezba038bc2015-10-08 12:03:00 -07001033FX_BOOL Document::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001034 CJS_PropValue& vp,
1035 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001036 CPDFSDK_InterForm* pInterForm =
1037 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001038
1039 if (vp.IsGetting()) {
1040 if (pInterForm->IsCalculateEnabled())
1041 vp << true;
1042 else
1043 vp << false;
1044 } else {
1045 bool bCalculate;
1046 vp >> bCalculate;
1047
1048 pInterForm->EnableCalculate(bCalculate);
1049 }
1050
1051 return TRUE;
1052}
1053
Tom Sepezba038bc2015-10-08 12:03:00 -07001054FX_BOOL Document::documentFileName(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001055 CJS_PropValue& vp,
1056 CFX_WideString& sError) {
1057 if (vp.IsSetting()) {
1058 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1059 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1060 return FALSE;
1061 }
1062 CFX_WideString wsFilePath = m_pDocument->GetPath();
1063 int32_t i = wsFilePath.GetLength() - 1;
1064 for (; i >= 0; i--) {
1065 if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/')
1066 break;
1067 }
1068 if (i >= 0 && i < wsFilePath.GetLength() - 1) {
1069 vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1);
1070 } else {
1071 vp << L"";
1072 }
1073 return TRUE;
1074}
1075
Tom Sepezba038bc2015-10-08 12:03:00 -07001076FX_BOOL Document::path(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001077 CJS_PropValue& vp,
1078 CFX_WideString& sError) {
1079 if (vp.IsSetting()) {
1080 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1081 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1082 return FALSE;
1083 }
1084 vp << app::SysPathToPDFPath(m_pDocument->GetPath());
1085 return TRUE;
1086}
1087
Tom Sepezba038bc2015-10-08 12:03:00 -07001088FX_BOOL Document::pageWindowRect(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001089 CJS_PropValue& vp,
1090 CFX_WideString& sError) {
1091 return TRUE;
1092}
1093
Tom Sepezba038bc2015-10-08 12:03:00 -07001094FX_BOOL Document::layout(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001095 CJS_PropValue& vp,
1096 CFX_WideString& sError) {
1097 return TRUE;
1098}
1099
Tom Sepezba038bc2015-10-08 12:03:00 -07001100FX_BOOL Document::addLink(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001101 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001102 CJS_Value& vRet,
1103 CFX_WideString& sError) {
1104 return TRUE;
1105}
1106
Tom Sepezba038bc2015-10-08 12:03:00 -07001107FX_BOOL Document::closeDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001108 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001109 CJS_Value& vRet,
1110 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001111 return TRUE;
1112}
1113
Tom Sepezba038bc2015-10-08 12:03:00 -07001114FX_BOOL Document::getPageBox(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001115 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001116 CJS_Value& vRet,
1117 CFX_WideString& sError) {
1118 return TRUE;
1119}
1120
Tom Sepezba038bc2015-10-08 12:03:00 -07001121FX_BOOL Document::getAnnot(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001122 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001123 CJS_Value& vRet,
1124 CFX_WideString& sError) {
1125 return TRUE;
1126}
1127
Tom Sepezba038bc2015-10-08 12:03:00 -07001128FX_BOOL Document::getAnnots(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001129 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001130 CJS_Value& vRet,
1131 CFX_WideString& sError) {
1132 vRet.SetNull();
1133 return TRUE;
1134}
1135
Tom Sepezba038bc2015-10-08 12:03:00 -07001136FX_BOOL Document::getAnnot3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001137 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001138 CJS_Value& vRet,
1139 CFX_WideString& sError) {
1140 vRet.SetNull();
1141 return TRUE;
1142}
1143
Tom Sepezba038bc2015-10-08 12:03:00 -07001144FX_BOOL Document::getAnnots3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001145 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001146 CJS_Value& vRet,
1147 CFX_WideString& sError) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001148 vRet = CJS_Value::VT_undefined;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001149 return TRUE;
1150}
1151
Tom Sepezba038bc2015-10-08 12:03:00 -07001152FX_BOOL Document::getOCGs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001153 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001154 CJS_Value& vRet,
1155 CFX_WideString& sError) {
1156 return TRUE;
1157}
1158
Tom Sepezba038bc2015-10-08 12:03:00 -07001159FX_BOOL Document::getLinks(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001160 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001161 CJS_Value& vRet,
1162 CFX_WideString& sError) {
1163 return TRUE;
1164}
1165
1166bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) {
1167 return (rect.left <= LinkRect.left && rect.top <= LinkRect.top &&
1168 rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom);
1169}
1170
Tom Sepezba038bc2015-10-08 12:03:00 -07001171FX_BOOL Document::addIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001172 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001173 CJS_Value& vRet,
1174 CFX_WideString& sError) {
1175 CJS_Context* pContext = (CJS_Context*)cc;
1176 if (params.size() != 2) {
1177 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1178 return FALSE;
1179 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001180 CFX_WideString swIconName = params[0].ToCFXWideString();
Tom Sepezaecd9d02015-08-31 15:04:12 -07001181
Tom Sepez39bfe122015-09-17 15:25:23 -07001182 if (params[1].GetType() != CJS_Value::VT_object) {
Tom Sepezaecd9d02015-08-31 15:04:12 -07001183 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1184 return FALSE;
1185 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001186
Tom Sepezcd56a7d2015-10-06 11:45:28 -07001187 v8::Local<v8::Object> pJSIcon = params[1].ToV8Object();
1188 if (FXJS_GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001189 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1190 return FALSE;
1191 }
1192
1193 CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
1194 if (!pEmbedObj) {
1195 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1196 return FALSE;
1197 }
1198
Tom Sepez6ba32d92016-01-05 16:26:32 -08001199 m_IconList.push_back(std::unique_ptr<IconElement>(
1200 new IconElement(swIconName, (Icon*)pEmbedObj)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001201 return TRUE;
1202}
1203
Tom Sepezba038bc2015-10-08 12:03:00 -07001204FX_BOOL Document::icons(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001205 CJS_PropValue& vp,
1206 CFX_WideString& sError) {
1207 if (vp.IsSetting()) {
1208 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1209 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1210 return FALSE;
1211 }
1212
Tom Sepez6ba32d92016-01-05 16:26:32 -08001213 if (m_IconList.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001214 vp.SetNull();
1215 return TRUE;
1216 }
1217
Tom Sepez67fd5df2015-10-08 12:24:19 -07001218 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
1219 CJS_Array Icons(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001220
Tom Sepez6ba32d92016-01-05 16:26:32 -08001221 int i = 0;
1222 for (const auto& pIconElement : m_IconList) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001223 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001224 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001225 if (pObj.IsEmpty())
1226 return FALSE;
1227
Tom Sepezd5a0e952015-09-17 15:40:06 -07001228 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001229 if (!pJS_Icon)
1230 return FALSE;
1231
1232 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1233 if (!pIcon)
1234 return FALSE;
1235
1236 pIcon->SetStream(pIconElement->IconStream->GetStream());
1237 pIcon->SetIconName(pIconElement->IconName);
Tom Sepez6ba32d92016-01-05 16:26:32 -08001238 Icons.SetElement(i++, CJS_Value(pRuntime, pJS_Icon));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001239 }
1240
1241 vp << Icons;
1242 return TRUE;
1243}
1244
Tom Sepezba038bc2015-10-08 12:03:00 -07001245FX_BOOL Document::getIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001246 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001247 CJS_Value& vRet,
1248 CFX_WideString& sError) {
1249 CJS_Context* pContext = (CJS_Context*)cc;
1250 if (params.size() != 1) {
1251 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1252 return FALSE;
1253 }
1254
Tom Sepez6ba32d92016-01-05 16:26:32 -08001255 if (m_IconList.empty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001256 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001257
Tom Sepez6ba32d92016-01-05 16:26:32 -08001258 CFX_WideString swIconName = params[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001259 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1260
Tom Sepez6ba32d92016-01-05 16:26:32 -08001261 for (const auto& pIconElement : m_IconList) {
1262 if (pIconElement->IconName == swIconName) {
1263 Icon* pRetIcon = pIconElement->IconStream;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001264
Tom Sepez39bfe122015-09-17 15:25:23 -07001265 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001266 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001267 if (pObj.IsEmpty())
1268 return FALSE;
1269
Tom Sepezd5a0e952015-09-17 15:40:06 -07001270 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001271 if (!pJS_Icon)
1272 return FALSE;
1273
1274 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1275 if (!pIcon)
1276 return FALSE;
1277
1278 pIcon->SetIconName(swIconName);
1279 pIcon->SetStream(pRetIcon->GetStream());
1280 vRet = pJS_Icon;
1281 return TRUE;
1282 }
1283 }
1284
1285 return FALSE;
1286}
1287
Tom Sepezba038bc2015-10-08 12:03:00 -07001288FX_BOOL Document::removeIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001289 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001290 CJS_Value& vRet,
1291 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001292 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001293 return TRUE;
1294}
1295
Tom Sepezba038bc2015-10-08 12:03:00 -07001296FX_BOOL Document::createDataObject(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001297 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001298 CJS_Value& vRet,
1299 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001300 // Unsafe, not implemented.
1301 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001302}
1303
Tom Sepezba038bc2015-10-08 12:03:00 -07001304FX_BOOL Document::media(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001305 CJS_PropValue& vp,
1306 CFX_WideString& sError) {
1307 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001308}
1309
Tom Sepezba038bc2015-10-08 12:03:00 -07001310FX_BOOL Document::calculateNow(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001311 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001312 CJS_Value& vRet,
1313 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001314 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001315 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001316 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001317 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001318
1319 CPDFSDK_InterForm* pInterForm =
1320 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001321 pInterForm->OnCalculate();
1322 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001323}
1324
Tom Sepezba038bc2015-10-08 12:03:00 -07001325FX_BOOL Document::Collab(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001326 CJS_PropValue& vp,
1327 CFX_WideString& sError) {
1328 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001329}
1330
Tom Sepezba038bc2015-10-08 12:03:00 -07001331FX_BOOL Document::getPageNthWord(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001332 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001333 CJS_Value& vRet,
1334 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001335 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1336 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -07001337
Lei Zhangdd734de2015-11-11 10:16:52 -08001338 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
1339 int nWordNo = params.size() > 1 ? params[1].ToInt() : 0;
1340 bool bStrip = params.size() > 2 ? params[2].ToBool() : true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001341
Tom Sepez50d12ad2015-11-24 09:50:51 -08001342 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001343 if (!pDocument)
1344 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001345
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001346 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1347 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1348 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1349 return FALSE;
1350 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001351
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001352 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1353 if (!pPageDict)
1354 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001355
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001356 CPDF_Page page;
1357 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001358 page.ParseContent(nullptr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001359
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001360 int nWords = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001361 CFX_WideString swRet;
Tom Sepez2398d892016-02-17 16:46:26 -08001362 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001363 if (pPageObj->IsText()) {
1364 CPDF_TextObject* pTextObj = pPageObj->AsText();
Tom Sepez2398d892016-02-17 16:46:26 -08001365 int nObjWords = CountWords(pTextObj);
1366 if (nWords + nObjWords >= nWordNo) {
1367 swRet = GetObjWordStr(pTextObj, nWordNo - nWords);
1368 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001369 }
Tom Sepez2398d892016-02-17 16:46:26 -08001370 nWords += nObjWords;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001371 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001372 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001373
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001374 if (bStrip) {
1375 swRet.TrimLeft();
1376 swRet.TrimRight();
1377 }
1378
1379 vRet = swRet.c_str();
1380 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001381}
1382
Tom Sepezba038bc2015-10-08 12:03:00 -07001383FX_BOOL Document::getPageNthWordQuads(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001384 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001385 CJS_Value& vRet,
1386 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001387 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1388 return FALSE;
1389
1390 return FALSE;
1391}
1392
Tom Sepezba038bc2015-10-08 12:03:00 -07001393FX_BOOL Document::getPageNumWords(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001394 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001395 CJS_Value& vRet,
1396 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001397 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1398 return FALSE;
1399
Lei Zhangdd734de2015-11-11 10:16:52 -08001400 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
Tom Sepez50d12ad2015-11-24 09:50:51 -08001401 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001402 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1403 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1404 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1405 return FALSE;
1406 }
1407
1408 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1409 if (!pPageDict)
1410 return FALSE;
1411
1412 CPDF_Page page;
1413 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001414 page.ParseContent(nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001415
1416 int nWords = 0;
Tom Sepez2398d892016-02-17 16:46:26 -08001417 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001418 if (pPageObj->IsText())
1419 nWords += CountWords(pPageObj->AsText());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001420 }
1421
1422 vRet = nWords;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001423 return TRUE;
1424}
1425
Tom Sepezba038bc2015-10-08 12:03:00 -07001426FX_BOOL Document::getPrintParams(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001427 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001428 CJS_Value& vRet,
1429 CFX_WideString& sError) {
1430 CJS_Context* pContext = (CJS_Context*)cc;
1431 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez39bfe122015-09-17 15:25:23 -07001432 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001433 pRuntime->GetIsolate(), pRuntime, CJS_PrintParamsObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001434
1435 // Not implemented yet.
1436
1437 vRet = pRetObj;
1438 return TRUE;
1439}
1440
1441#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
1442
1443int Document::CountWords(CPDF_TextObject* pTextObj) {
1444 if (!pTextObj)
1445 return 0;
1446
1447 int nWords = 0;
1448
1449 CPDF_Font* pFont = pTextObj->GetFont();
1450 if (!pFont)
1451 return 0;
1452
1453 FX_BOOL bIsLatin = FALSE;
1454
1455 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001456 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001457 FX_FLOAT kerning;
1458
1459 pTextObj->GetCharInfo(i, charcode, kerning);
1460 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1461
Tom Sepez62a70f92016-03-21 15:00:20 -07001462 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001463 if (swUnicode.GetLength() > 0)
1464 unicode = swUnicode[0];
1465
1466 if (ISLATINWORD(unicode) && bIsLatin)
1467 continue;
1468
1469 bIsLatin = ISLATINWORD(unicode);
1470 if (unicode != 0x20)
1471 nWords++;
1472 }
1473
1474 return nWords;
1475}
1476
1477CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj,
1478 int nWordIndex) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001479 CFX_WideString swRet;
1480
1481 CPDF_Font* pFont = pTextObj->GetFont();
1482 if (!pFont)
1483 return L"";
1484
1485 int nWords = 0;
1486 FX_BOOL bIsLatin = FALSE;
1487
1488 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001489 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001490 FX_FLOAT kerning;
1491
1492 pTextObj->GetCharInfo(i, charcode, kerning);
1493 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1494
Tom Sepez62a70f92016-03-21 15:00:20 -07001495 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001496 if (swUnicode.GetLength() > 0)
1497 unicode = swUnicode[0];
1498
1499 if (ISLATINWORD(unicode) && bIsLatin) {
1500 } else {
1501 bIsLatin = ISLATINWORD(unicode);
1502 if (unicode != 0x20)
1503 nWords++;
1504 }
1505
1506 if (nWords - 1 == nWordIndex)
1507 swRet += unicode;
1508 }
1509
1510 return swRet;
1511}
1512
Tom Sepezba038bc2015-10-08 12:03:00 -07001513FX_BOOL Document::zoom(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001514 CJS_PropValue& vp,
1515 CFX_WideString& sError) {
1516 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001517}
1518
1519/**
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001520(none, NoVary)
1521(fitP, FitPage)
1522(fitW, FitWidth)
1523(fitH, FitHeight)
1524(fitV, FitVisibleWidth)
1525(pref, Preferred)
1526(refW, ReflowWidth)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001527*/
1528
Tom Sepezba038bc2015-10-08 12:03:00 -07001529FX_BOOL Document::zoomType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001530 CJS_PropValue& vp,
1531 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001532 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001533}
1534
Tom Sepezba038bc2015-10-08 12:03:00 -07001535FX_BOOL Document::deletePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001536 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001537 CJS_Value& vRet,
1538 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001539 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001540 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001541}
JUN FANG33f6f0d2015-04-06 12:39:51 -07001542
Tom Sepezba038bc2015-10-08 12:03:00 -07001543FX_BOOL Document::extractPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001544 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001545 CJS_Value& vRet,
1546 CFX_WideString& sError) {
1547 // Unsafe, not supported.
1548 return TRUE;
1549}
1550
Tom Sepezba038bc2015-10-08 12:03:00 -07001551FX_BOOL Document::insertPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001552 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001553 CJS_Value& vRet,
1554 CFX_WideString& sError) {
1555 // Unsafe, not supported.
1556 return TRUE;
1557}
1558
Tom Sepezba038bc2015-10-08 12:03:00 -07001559FX_BOOL Document::replacePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001560 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001561 CJS_Value& vRet,
1562 CFX_WideString& sError) {
1563 // Unsafe, not supported.
1564 return TRUE;
1565}
1566
Tom Sepezba038bc2015-10-08 12:03:00 -07001567FX_BOOL Document::getURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001568 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001569 CJS_Value& vRet,
1570 CFX_WideString& sError) {
1571 // Unsafe, not supported.
1572 return TRUE;
1573}
1574
1575void Document::AddDelayData(CJS_DelayData* pData) {
Tom Sepez56c10192016-03-15 12:34:17 -07001576 m_DelayData.push_back(std::unique_ptr<CJS_DelayData>(pData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001577}
1578
1579void Document::DoFieldDelay(const CFX_WideString& sFieldName,
1580 int nControlIndex) {
Tom Sepez56c10192016-03-15 12:34:17 -07001581 std::vector<std::unique_ptr<CJS_DelayData>> DelayDataForFieldAndControlIndex;
1582 auto iter = m_DelayData.begin();
1583 while (iter != m_DelayData.end()) {
1584 auto old = iter++;
1585 if ((*old)->sFieldName == sFieldName &&
1586 (*old)->nControlIndex == nControlIndex) {
1587 DelayDataForFieldAndControlIndex.push_back(std::move(*old));
1588 m_DelayData.erase(old);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001589 }
1590 }
1591
Tom Sepez56c10192016-03-15 12:34:17 -07001592 for (const auto& pData : DelayDataForFieldAndControlIndex)
1593 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001594}
1595
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001596CJS_Document* Document::GetCJSDoc() const {
1597 return static_cast<CJS_Document*>(m_pJSObject);
JUN FANG33f6f0d2015-04-06 12:39:51 -07001598}