blob: ace805f3b57861581077a211c96212e7c564f477 [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),
thestig1cd352e2016-06-07 17:53:06 -0700150 m_isolate(nullptr),
151 m_pDocument(nullptr),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152 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
tsepez23ae4a52016-06-08 20:44:54 -0700382 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700383 CFX_ByteTextBuf textBuf;
384 if (!pInterForm->ExportFormToFDFTextBuf(textBuf))
385 return FALSE;
386
387 CJS_Context* pContext = (CJS_Context*)cc;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700388 CPDFDoc_Environment* pEnv = pContext->GetReaderApp();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700389 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700390
391 pRuntime->BeginBlock();
392 pEnv->JS_docmailForm(textBuf.GetBuffer(), textBuf.GetLength(), bUI,
393 cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(),
394 cMsg.c_str());
395 pRuntime->EndBlock();
396 return TRUE;
397}
398
Tom Sepezba038bc2015-10-08 12:03:00 -0700399FX_BOOL Document::print(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800400 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401 CJS_Value& vRet,
402 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403 FX_BOOL bUI = TRUE;
404 int nStart = 0;
405 int nEnd = 0;
406 FX_BOOL bSilent = FALSE;
407 FX_BOOL bShrinkToFit = FALSE;
408 FX_BOOL bPrintAsImage = FALSE;
409 FX_BOOL bReverse = FALSE;
410 FX_BOOL bAnnotations = FALSE;
411
412 int nlength = params.size();
413 if (nlength == 9) {
tsepez40faa792016-07-15 17:58:02 -0700414 if (params[8].GetType() == CJS_Value::VT_object) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700415 v8::Local<v8::Object> pObj = params[8].ToV8Object();
tsepez40faa792016-07-15 17:58:02 -0700416 if (FXJS_GetObjDefnID(pObj) == CJS_PrintParamsObj::g_nObjDefnID) {
417 if (CJS_Object* pJSObj = params[8].ToCJSObject()) {
418 if (PrintParamsObj* pprintparamsObj =
419 static_cast<PrintParamsObj*>(pJSObj->GetEmbedObject())) {
420 bUI = pprintparamsObj->bUI;
421 nStart = pprintparamsObj->nStart;
422 nEnd = pprintparamsObj->nEnd;
423 bSilent = pprintparamsObj->bSilent;
424 bShrinkToFit = pprintparamsObj->bShrinkToFit;
425 bPrintAsImage = pprintparamsObj->bPrintAsImage;
426 bReverse = pprintparamsObj->bReverse;
427 bAnnotations = pprintparamsObj->bAnnotations;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700428 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700429 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700430 }
431 }
432 } else {
433 if (nlength >= 1)
434 bUI = params[0].ToBool();
435 if (nlength >= 2)
436 nStart = params[1].ToInt();
437 if (nlength >= 3)
438 nEnd = params[2].ToInt();
439 if (nlength >= 4)
440 bSilent = params[3].ToBool();
441 if (nlength >= 5)
442 bShrinkToFit = params[4].ToBool();
443 if (nlength >= 6)
444 bPrintAsImage = params[5].ToBool();
445 if (nlength >= 7)
446 bReverse = params[6].ToBool();
447 if (nlength >= 8)
448 bAnnotations = params[7].ToBool();
449 }
450
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451 if (CPDFDoc_Environment* pEnv = m_pDocument->GetEnv()) {
452 pEnv->JS_docprint(bUI, nStart, nEnd, bSilent, bShrinkToFit, bPrintAsImage,
453 bReverse, bAnnotations);
454 return TRUE;
455 }
456 return FALSE;
457}
458
459// removes the specified field from the document.
460// comment:
461// note: if the filed name is not retional, adobe is dumb for it.
462
Tom Sepezba038bc2015-10-08 12:03:00 -0700463FX_BOOL Document::removeField(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800464 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700465 CJS_Value& vRet,
466 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700467 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
468 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM)))
469 return FALSE;
470
471 CJS_Context* pContext = (CJS_Context*)cc;
472 if (params.size() != 1) {
473 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
474 return FALSE;
475 }
476
477 CFX_WideString sFieldName = params[0].ToCFXWideString();
tsepez23ae4a52016-06-08 20:44:54 -0700478 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -0800479 std::vector<CPDFSDK_Widget*> widgets;
480 pInterForm->GetWidgets(sFieldName, &widgets);
Lei Zhangd88a3642015-11-10 09:38:57 -0800481 if (widgets.empty())
482 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700483
Lei Zhangd88a3642015-11-10 09:38:57 -0800484 for (CPDFSDK_Widget* pWidget : widgets) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800485 CFX_FloatRect rcAnnot = pWidget->GetRect();
Lei Zhangd88a3642015-11-10 09:38:57 -0800486 --rcAnnot.left;
487 --rcAnnot.bottom;
488 ++rcAnnot.right;
489 ++rcAnnot.top;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490
tsepezdf964df2016-04-21 12:09:41 -0700491 std::vector<CFX_FloatRect> aRefresh(1, rcAnnot);
Tom Sepez50d12ad2015-11-24 09:50:51 -0800492 UnderlyingPageType* pPage = pWidget->GetUnderlyingPage();
Lei Zhangd88a3642015-11-10 09:38:57 -0800493 ASSERT(pPage);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700494
dsinclair461eeaf2016-07-27 07:40:05 -0700495 CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(pPage, true);
Lei Zhangd88a3642015-11-10 09:38:57 -0800496 pPageView->DeleteAnnot(pWidget);
497 pPageView->UpdateRects(aRefresh);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700498 }
Lei Zhangd88a3642015-11-10 09:38:57 -0800499 m_pDocument->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700500
501 return TRUE;
502}
503
504// reset filed values within a document.
505// comment:
506// note: if the fields names r not rational, aodbe is dumb for it.
507
Tom Sepezba038bc2015-10-08 12:03:00 -0700508FX_BOOL Document::resetForm(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800509 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700510 CJS_Value& vRet,
511 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700512 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
513 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
514 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
515 return FALSE;
516
tsepez23ae4a52016-06-08 20:44:54 -0700517 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700518 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700519 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
520 CJS_Array aName(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700521
Lei Zhangdd734de2015-11-11 10:16:52 -0800522 if (params.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700523 pPDFForm->ResetForm(TRUE);
524 m_pDocument->SetChangeMark();
Lei Zhangd88a3642015-11-10 09:38:57 -0800525 return TRUE;
526 }
527
528 switch (params[0].GetType()) {
529 default:
530 aName.Attach(params[0].ToV8Array());
531 break;
532 case CJS_Value::VT_string:
533 aName.SetElement(0, params[0]);
534 break;
535 }
536
537 std::vector<CPDF_FormField*> aFields;
538 for (int i = 0, isz = aName.GetLength(); i < isz; ++i) {
539 CJS_Value valElement(pRuntime);
540 aName.GetElement(i, valElement);
541 CFX_WideString swVal = valElement.ToCFXWideString();
542 for (int j = 0, jsz = pPDFForm->CountFields(swVal); j < jsz; ++j)
543 aFields.push_back(pPDFForm->GetField(j, swVal));
544 }
545
546 if (!aFields.empty()) {
547 pPDFForm->ResetForm(aFields, TRUE, TRUE);
548 m_pDocument->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700549 }
550
551 return TRUE;
552}
553
Tom Sepezba038bc2015-10-08 12:03:00 -0700554FX_BOOL Document::saveAs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800555 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700556 CJS_Value& vRet,
557 CFX_WideString& sError) {
558 // Unsafe, not supported.
559 return TRUE;
560}
561
Tom Sepezba038bc2015-10-08 12:03:00 -0700562FX_BOOL Document::submitForm(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800563 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700564 CJS_Value& vRet,
565 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700566 CJS_Context* pContext = (CJS_Context*)cc;
567 int nSize = params.size();
568 if (nSize < 1) {
569 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
570 return FALSE;
571 }
572
Tom Sepez67fd5df2015-10-08 12:24:19 -0700573 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
574 v8::Isolate* isolate = pRuntime->GetIsolate();
575 CJS_Array aFields(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700576 CFX_WideString strURL;
577 FX_BOOL bFDF = TRUE;
578 FX_BOOL bEmpty = FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700579
580 CJS_Value v = params[0];
Tom Sepez39bfe122015-09-17 15:25:23 -0700581 if (v.GetType() == CJS_Value::VT_string) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700582 strURL = params[0].ToCFXWideString();
583 if (nSize > 1)
584 bFDF = params[1].ToBool();
585 if (nSize > 2)
586 bEmpty = params[2].ToBool();
587 if (nSize > 3)
588 aFields.Attach(params[3].ToV8Array());
Tom Sepez39bfe122015-09-17 15:25:23 -0700589 } else if (v.GetType() == CJS_Value::VT_object) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700590 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Tom Sepez39bfe122015-09-17 15:25:23 -0700591 v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"cURL");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700592 if (!pValue.IsEmpty())
tsepez40faa792016-07-15 17:58:02 -0700593 strURL = CJS_Value(pRuntime, pValue).ToCFXWideString();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700594
Tom Sepez39bfe122015-09-17 15:25:23 -0700595 pValue = FXJS_GetObjectElement(isolate, pObj, L"bFDF");
tsepez40faa792016-07-15 17:58:02 -0700596 bFDF = CJS_Value(pRuntime, pValue).ToBool();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700597
Tom Sepez39bfe122015-09-17 15:25:23 -0700598 pValue = FXJS_GetObjectElement(isolate, pObj, L"bEmpty");
tsepez40faa792016-07-15 17:58:02 -0700599 bEmpty = CJS_Value(pRuntime, pValue).ToBool();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700600
Tom Sepez39bfe122015-09-17 15:25:23 -0700601 pValue = FXJS_GetObjectElement(isolate, pObj, L"aFields");
tsepez40faa792016-07-15 17:58:02 -0700602 aFields.Attach(CJS_Value(pRuntime, pValue).ToV8Array());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700603 }
604
tsepez23ae4a52016-06-08 20:44:54 -0700605 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700606 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
Tom Sepez007e6c02016-02-26 14:31:56 -0800607 if (aFields.GetLength() == 0 && bEmpty) {
Lei Zhangd88a3642015-11-10 09:38:57 -0800608 if (pPDFInterForm->CheckRequiredFields(nullptr, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700609 pRuntime->BeginBlock();
610 pInterForm->SubmitForm(strURL, FALSE);
611 pRuntime->EndBlock();
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700612 }
613 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700614 }
615
Lei Zhangd88a3642015-11-10 09:38:57 -0800616 std::vector<CPDF_FormField*> fieldObjects;
617 for (int i = 0, sz = aFields.GetLength(); i < sz; ++i) {
Tom Sepez67fd5df2015-10-08 12:24:19 -0700618 CJS_Value valName(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619 aFields.GetElement(i, valName);
620
621 CFX_WideString sName = valName.ToCFXWideString();
622 CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
623 for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j) {
624 CPDF_FormField* pField = pPDFForm->GetField(j, sName);
625 if (!bEmpty && pField->GetValue().IsEmpty())
626 continue;
627
Lei Zhangd88a3642015-11-10 09:38:57 -0800628 fieldObjects.push_back(pField);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700629 }
630 }
631
Lei Zhangd88a3642015-11-10 09:38:57 -0800632 if (pPDFInterForm->CheckRequiredFields(&fieldObjects, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633 pRuntime->BeginBlock();
Wei Li97da9762016-03-11 17:00:48 -0800634 pInterForm->SubmitFields(strURL, fieldObjects, true, !bFDF);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700635 pRuntime->EndBlock();
636 }
637 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700638}
639
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700640void Document::AttachDoc(CPDFSDK_Document* pDoc) {
641 m_pDocument = pDoc;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700642}
643
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700644CPDFSDK_Document* Document::GetReaderDoc() {
645 return m_pDocument;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700646}
647
Tom Sepezba038bc2015-10-08 12:03:00 -0700648FX_BOOL Document::bookmarkRoot(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700649 CJS_PropValue& vp,
650 CFX_WideString& sError) {
651 return TRUE;
652}
653
Tom Sepezba038bc2015-10-08 12:03:00 -0700654FX_BOOL Document::mailDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800655 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700656 CJS_Value& vRet,
657 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700658 FX_BOOL bUI = TRUE;
659 CFX_WideString cTo = L"";
660 CFX_WideString cCc = L"";
661 CFX_WideString cBcc = L"";
662 CFX_WideString cSubject = L"";
663 CFX_WideString cMsg = L"";
664
665 if (params.size() >= 1)
666 bUI = params[0].ToBool();
667 if (params.size() >= 2)
668 cTo = params[1].ToCFXWideString();
669 if (params.size() >= 3)
670 cCc = params[2].ToCFXWideString();
671 if (params.size() >= 4)
672 cBcc = params[3].ToCFXWideString();
673 if (params.size() >= 5)
674 cSubject = params[4].ToCFXWideString();
675 if (params.size() >= 6)
676 cMsg = params[5].ToCFXWideString();
677
Tom Sepez67fd5df2015-10-08 12:24:19 -0700678 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
679 v8::Isolate* isolate = pRuntime->GetIsolate();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700680
Tom Sepez39bfe122015-09-17 15:25:23 -0700681 if (params.size() >= 1 && params[0].GetType() == CJS_Value::VT_object) {
Tom Sepez808a99e2015-09-10 12:28:37 -0700682 v8::Local<v8::Object> pObj = params[0].ToV8Object();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700683
Tom Sepez39bfe122015-09-17 15:25:23 -0700684 v8::Local<v8::Value> pValue = FXJS_GetObjectElement(isolate, pObj, L"bUI");
tsepez40faa792016-07-15 17:58:02 -0700685 bUI = CJS_Value(pRuntime, pValue).ToInt();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700686
Tom Sepez39bfe122015-09-17 15:25:23 -0700687 pValue = FXJS_GetObjectElement(isolate, pObj, L"cTo");
tsepez40faa792016-07-15 17:58:02 -0700688 cTo = CJS_Value(pRuntime, pValue).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700689
Tom Sepez39bfe122015-09-17 15:25:23 -0700690 pValue = FXJS_GetObjectElement(isolate, pObj, L"cCc");
tsepez40faa792016-07-15 17:58:02 -0700691 cCc = CJS_Value(pRuntime, pValue).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700692
Tom Sepez39bfe122015-09-17 15:25:23 -0700693 pValue = FXJS_GetObjectElement(isolate, pObj, L"cBcc");
tsepez40faa792016-07-15 17:58:02 -0700694 cBcc = CJS_Value(pRuntime, pValue).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700695
Tom Sepez39bfe122015-09-17 15:25:23 -0700696 pValue = FXJS_GetObjectElement(isolate, pObj, L"cSubject");
tsepez40faa792016-07-15 17:58:02 -0700697 cSubject = CJS_Value(pRuntime, pValue).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700698
Tom Sepez39bfe122015-09-17 15:25:23 -0700699 pValue = FXJS_GetObjectElement(isolate, pObj, L"cMsg");
tsepez40faa792016-07-15 17:58:02 -0700700 cMsg = CJS_Value(pRuntime, pValue).ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700701 }
702
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700703 pRuntime->BeginBlock();
704 CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
thestig1cd352e2016-06-07 17:53:06 -0700705 pEnv->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(), cSubject.c_str(),
706 cCc.c_str(), cBcc.c_str(), cMsg.c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700707 pRuntime->EndBlock();
708
709 return TRUE;
710}
711
Tom Sepezba038bc2015-10-08 12:03:00 -0700712FX_BOOL Document::author(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700713 CJS_PropValue& vp,
714 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800715 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700716 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700717 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700718
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700719 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800720 vp << pDictionary->GetUnicodeTextBy("Author");
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700721 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700722 } else {
723 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
724 return FALSE;
725
726 CFX_WideString csAuthor;
727 vp >> csAuthor;
728 pDictionary->SetAtString("Author", PDF_EncodeText(csAuthor));
729 m_pDocument->SetChangeMark();
730 return TRUE;
731 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700732}
733
Tom Sepezba038bc2015-10-08 12:03:00 -0700734FX_BOOL Document::info(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700735 CJS_PropValue& vp,
736 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800737 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700738 if (!pDictionary)
739 return FALSE;
Tom Sepezc6ab1722015-02-05 15:27:25 -0800740
Wei Li9b761132016-01-29 15:44:20 -0800741 CFX_WideString cwAuthor = pDictionary->GetUnicodeTextBy("Author");
742 CFX_WideString cwTitle = pDictionary->GetUnicodeTextBy("Title");
743 CFX_WideString cwSubject = pDictionary->GetUnicodeTextBy("Subject");
744 CFX_WideString cwKeywords = pDictionary->GetUnicodeTextBy("Keywords");
745 CFX_WideString cwCreator = pDictionary->GetUnicodeTextBy("Creator");
746 CFX_WideString cwProducer = pDictionary->GetUnicodeTextBy("Producer");
747 CFX_WideString cwCreationDate = pDictionary->GetUnicodeTextBy("CreationDate");
748 CFX_WideString cwModDate = pDictionary->GetUnicodeTextBy("ModDate");
749 CFX_WideString cwTrapped = pDictionary->GetUnicodeTextBy("Trapped");
Tom Sepezc6ab1722015-02-05 15:27:25 -0800750
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700751 v8::Isolate* isolate = GetIsolate(cc);
752 if (vp.IsGetting()) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700753 CJS_Context* pContext = (CJS_Context*)cc;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700754 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez808a99e2015-09-10 12:28:37 -0700755 v8::Local<v8::Object> pObj =
Tom Sepez33420902015-10-13 15:00:10 -0700756 FXJS_NewFxDynamicObj(pRuntime->GetIsolate(), pRuntime, -1);
tsepez018935c2016-04-15 13:15:12 -0700757 FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor);
758 FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle);
759 FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject);
760 FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords);
761 FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator);
762 FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer);
763 FXJS_PutObjectString(isolate, pObj, L"CreationDate", cwCreationDate);
764 FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate);
765 FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped);
Tom Sepezc6ab1722015-02-05 15:27:25 -0800766
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700767 // It's to be compatible to non-standard info dictionary.
Oliver Chang3f1c71f2016-01-11 08:45:31 -0800768 for (const auto& it : *pDictionary) {
769 const CFX_ByteString& bsKey = it.first;
770 CPDF_Object* pValueObj = it.second;
tsepez4c3debb2016-04-08 12:20:38 -0700771 CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsStringC());
Dan Sinclair710c9092015-10-21 15:46:10 -0400772 if (pValueObj->IsString() || pValueObj->IsName()) {
tsepez018935c2016-04-15 13:15:12 -0700773 FXJS_PutObjectString(isolate, pObj, wsKey, pValueObj->GetUnicodeText());
Dan Sinclair710c9092015-10-21 15:46:10 -0400774 } else if (pValueObj->IsNumber()) {
tsepez018935c2016-04-15 13:15:12 -0700775 FXJS_PutObjectNumber(isolate, pObj, wsKey,
Tom Sepez39bfe122015-09-17 15:25:23 -0700776 (float)pValueObj->GetNumber());
Dan Sinclair710c9092015-10-21 15:46:10 -0400777 } else if (pValueObj->IsBoolean()) {
tsepez018935c2016-04-15 13:15:12 -0700778 FXJS_PutObjectBoolean(isolate, pObj, wsKey, !!pValueObj->GetInteger());
Dan Sinclair05d9e932015-10-20 16:44:57 -0400779 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700780 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700781 vp << pObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700782 }
Tom Sepezdfbf8e72015-10-14 14:17:26 -0700783 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700784}
785
Tom Sepezba038bc2015-10-08 12:03:00 -0700786FX_BOOL Document::creationDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700787 CJS_PropValue& vp,
788 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800789 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700791 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700792
793 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800794 vp << pDictionary->GetUnicodeTextBy("CreationDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700795 } else {
796 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
797 return FALSE;
798
799 CFX_WideString csCreationDate;
800 vp >> csCreationDate;
801 pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
802 m_pDocument->SetChangeMark();
803 }
804 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700805}
806
Tom Sepezba038bc2015-10-08 12:03:00 -0700807FX_BOOL Document::creator(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700808 CJS_PropValue& vp,
809 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800810 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700811 if (!pDictionary)
812 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -0700813
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700814 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800815 vp << pDictionary->GetUnicodeTextBy("Creator");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700816 } else {
817 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
818 return FALSE;
819
820 CFX_WideString csCreator;
821 vp >> csCreator;
822 pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
823 m_pDocument->SetChangeMark();
824 }
825 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700826}
827
Tom Sepezba038bc2015-10-08 12:03:00 -0700828FX_BOOL Document::delay(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700829 CJS_PropValue& vp,
830 CFX_WideString& sError) {
831 if (vp.IsGetting()) {
832 vp << m_bDelay;
833 } else {
834 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
835 return FALSE;
836
837 vp >> m_bDelay;
838 if (m_bDelay) {
Tom Sepez56c10192016-03-15 12:34:17 -0700839 m_DelayData.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700840 } else {
Tom Sepez56c10192016-03-15 12:34:17 -0700841 std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
842 DelayDataToProcess.swap(m_DelayData);
843 for (const auto& pData : DelayDataToProcess)
844 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700845 }
846 }
847 return TRUE;
848}
849
Tom Sepezba038bc2015-10-08 12:03:00 -0700850FX_BOOL Document::keywords(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700851 CJS_PropValue& vp,
852 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800853 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700854 if (!pDictionary)
855 return FALSE;
856
857 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800858 vp << pDictionary->GetUnicodeTextBy("Keywords");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700859 } else {
860 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
861 return FALSE;
862
863 CFX_WideString csKeywords;
864 vp >> csKeywords;
865 pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
866 m_pDocument->SetChangeMark();
867 }
868 return TRUE;
869}
870
Tom Sepezba038bc2015-10-08 12:03:00 -0700871FX_BOOL Document::modDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700872 CJS_PropValue& vp,
873 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800874 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700875 if (!pDictionary)
876 return FALSE;
877
878 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800879 vp << pDictionary->GetUnicodeTextBy("ModDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700880 } else {
881 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
882 return FALSE;
883
884 CFX_WideString csmodDate;
885 vp >> csmodDate;
886 pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
887 m_pDocument->SetChangeMark();
888 }
889 return TRUE;
890}
891
Tom Sepezba038bc2015-10-08 12:03:00 -0700892FX_BOOL Document::producer(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700893 CJS_PropValue& vp,
894 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800895 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700896 if (!pDictionary)
897 return FALSE;
898
899 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800900 vp << pDictionary->GetUnicodeTextBy("Producer");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700901 } else {
902 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
903 return FALSE;
904
905 CFX_WideString csproducer;
906 vp >> csproducer;
907 pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
908 m_pDocument->SetChangeMark();
909 }
910 return TRUE;
911}
912
Tom Sepezba038bc2015-10-08 12:03:00 -0700913FX_BOOL Document::subject(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700914 CJS_PropValue& vp,
915 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800916 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700917 if (!pDictionary)
918 return FALSE;
919
920 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800921 vp << pDictionary->GetUnicodeTextBy("Subject");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700922 } else {
923 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
924 return FALSE;
925
926 CFX_WideString cssubject;
927 vp >> cssubject;
928 pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
929 m_pDocument->SetChangeMark();
930 }
931 return TRUE;
932}
933
Tom Sepezba038bc2015-10-08 12:03:00 -0700934FX_BOOL Document::title(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700935 CJS_PropValue& vp,
936 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800937 if (!m_pDocument || !m_pDocument->GetUnderlyingDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700938 return FALSE;
939
Tom Sepez50d12ad2015-11-24 09:50:51 -0800940 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700941 if (!pDictionary)
942 return FALSE;
943
944 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800945 vp << pDictionary->GetUnicodeTextBy("Title");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700946 } else {
947 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
948 return FALSE;
949
950 CFX_WideString cstitle;
951 vp >> cstitle;
952 pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
953 m_pDocument->SetChangeMark();
954 }
955 return TRUE;
956}
957
Tom Sepezba038bc2015-10-08 12:03:00 -0700958FX_BOOL Document::numPages(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700959 CJS_PropValue& vp,
960 CFX_WideString& sError) {
961 if (vp.IsSetting()) {
962 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
963 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
964 return FALSE;
965 }
966 vp << m_pDocument->GetPageCount();
967 return TRUE;
968}
969
Tom Sepezba038bc2015-10-08 12:03:00 -0700970FX_BOOL Document::external(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700971 CJS_PropValue& vp,
972 CFX_WideString& sError) {
973 // In Chrome case,should always return true.
974 if (vp.IsGetting()) {
975 vp << true;
976 }
977 return TRUE;
978}
979
Tom Sepezba038bc2015-10-08 12:03:00 -0700980FX_BOOL Document::filesize(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981 CJS_PropValue& vp,
982 CFX_WideString& sError) {
983 if (vp.IsSetting()) {
984 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
985 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
986 return FALSE;
987 }
988 vp << 0;
989 return TRUE;
990}
991
Tom Sepezba038bc2015-10-08 12:03:00 -0700992FX_BOOL Document::mouseX(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700993 CJS_PropValue& vp,
994 CFX_WideString& sError) {
995 return TRUE;
996}
997
Tom Sepezba038bc2015-10-08 12:03:00 -0700998FX_BOOL Document::mouseY(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700999 CJS_PropValue& vp,
1000 CFX_WideString& sError) {
1001 return TRUE;
1002}
1003
Tom Sepezba038bc2015-10-08 12:03:00 -07001004FX_BOOL Document::baseURL(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001005 CJS_PropValue& vp,
1006 CFX_WideString& sError) {
1007 if (vp.IsGetting()) {
1008 vp << m_cwBaseURL;
1009 } else {
1010 vp >> m_cwBaseURL;
1011 }
1012 return TRUE;
1013}
1014
Tom Sepezba038bc2015-10-08 12:03:00 -07001015FX_BOOL Document::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001016 CJS_PropValue& vp,
1017 CFX_WideString& sError) {
tsepez23ae4a52016-06-08 20:44:54 -07001018 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001019 if (vp.IsGetting()) {
1020 if (pInterForm->IsCalculateEnabled())
1021 vp << true;
1022 else
1023 vp << false;
1024 } else {
1025 bool bCalculate;
1026 vp >> bCalculate;
1027
1028 pInterForm->EnableCalculate(bCalculate);
1029 }
1030
1031 return TRUE;
1032}
1033
Tom Sepezba038bc2015-10-08 12:03:00 -07001034FX_BOOL Document::documentFileName(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001035 CJS_PropValue& vp,
1036 CFX_WideString& sError) {
1037 if (vp.IsSetting()) {
1038 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1039 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1040 return FALSE;
1041 }
1042 CFX_WideString wsFilePath = m_pDocument->GetPath();
1043 int32_t i = wsFilePath.GetLength() - 1;
1044 for (; i >= 0; i--) {
1045 if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/')
1046 break;
1047 }
1048 if (i >= 0 && i < wsFilePath.GetLength() - 1) {
1049 vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1);
1050 } else {
1051 vp << L"";
1052 }
1053 return TRUE;
1054}
1055
Tom Sepezba038bc2015-10-08 12:03:00 -07001056FX_BOOL Document::path(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001057 CJS_PropValue& vp,
1058 CFX_WideString& sError) {
1059 if (vp.IsSetting()) {
1060 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1061 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1062 return FALSE;
1063 }
1064 vp << app::SysPathToPDFPath(m_pDocument->GetPath());
1065 return TRUE;
1066}
1067
Tom Sepezba038bc2015-10-08 12:03:00 -07001068FX_BOOL Document::pageWindowRect(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001069 CJS_PropValue& vp,
1070 CFX_WideString& sError) {
1071 return TRUE;
1072}
1073
Tom Sepezba038bc2015-10-08 12:03:00 -07001074FX_BOOL Document::layout(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001075 CJS_PropValue& vp,
1076 CFX_WideString& sError) {
1077 return TRUE;
1078}
1079
Tom Sepezba038bc2015-10-08 12:03:00 -07001080FX_BOOL Document::addLink(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001081 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001082 CJS_Value& vRet,
1083 CFX_WideString& sError) {
1084 return TRUE;
1085}
1086
Tom Sepezba038bc2015-10-08 12:03:00 -07001087FX_BOOL Document::closeDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001088 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001089 CJS_Value& vRet,
1090 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001091 return TRUE;
1092}
1093
Tom Sepezba038bc2015-10-08 12:03:00 -07001094FX_BOOL Document::getPageBox(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001095 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001096 CJS_Value& vRet,
1097 CFX_WideString& sError) {
1098 return TRUE;
1099}
1100
Tom Sepezba038bc2015-10-08 12:03:00 -07001101FX_BOOL Document::getAnnot(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001102 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001103 CJS_Value& vRet,
1104 CFX_WideString& sError) {
1105 return TRUE;
1106}
1107
Tom Sepezba038bc2015-10-08 12:03:00 -07001108FX_BOOL Document::getAnnots(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001109 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001110 CJS_Value& vRet,
1111 CFX_WideString& sError) {
1112 vRet.SetNull();
1113 return TRUE;
1114}
1115
Tom Sepezba038bc2015-10-08 12:03:00 -07001116FX_BOOL Document::getAnnot3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001117 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001118 CJS_Value& vRet,
1119 CFX_WideString& sError) {
1120 vRet.SetNull();
1121 return TRUE;
1122}
1123
Tom Sepezba038bc2015-10-08 12:03:00 -07001124FX_BOOL Document::getAnnots3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001125 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001126 CJS_Value& vRet,
1127 CFX_WideString& sError) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001128 vRet = CJS_Value::VT_undefined;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001129 return TRUE;
1130}
1131
Tom Sepezba038bc2015-10-08 12:03:00 -07001132FX_BOOL Document::getOCGs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001133 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001134 CJS_Value& vRet,
1135 CFX_WideString& sError) {
1136 return TRUE;
1137}
1138
Tom Sepezba038bc2015-10-08 12:03:00 -07001139FX_BOOL Document::getLinks(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001140 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001141 CJS_Value& vRet,
1142 CFX_WideString& sError) {
1143 return TRUE;
1144}
1145
1146bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) {
1147 return (rect.left <= LinkRect.left && rect.top <= LinkRect.top &&
1148 rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom);
1149}
1150
Tom Sepezba038bc2015-10-08 12:03:00 -07001151FX_BOOL Document::addIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001152 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001153 CJS_Value& vRet,
1154 CFX_WideString& sError) {
1155 CJS_Context* pContext = (CJS_Context*)cc;
1156 if (params.size() != 2) {
1157 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1158 return FALSE;
1159 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001160 CFX_WideString swIconName = params[0].ToCFXWideString();
Tom Sepezaecd9d02015-08-31 15:04:12 -07001161
Tom Sepez39bfe122015-09-17 15:25:23 -07001162 if (params[1].GetType() != CJS_Value::VT_object) {
Tom Sepezaecd9d02015-08-31 15:04:12 -07001163 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1164 return FALSE;
1165 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001166
Tom Sepezcd56a7d2015-10-06 11:45:28 -07001167 v8::Local<v8::Object> pJSIcon = params[1].ToV8Object();
1168 if (FXJS_GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001169 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1170 return FALSE;
1171 }
1172
1173 CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
1174 if (!pEmbedObj) {
1175 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1176 return FALSE;
1177 }
1178
Tom Sepez6ba32d92016-01-05 16:26:32 -08001179 m_IconList.push_back(std::unique_ptr<IconElement>(
1180 new IconElement(swIconName, (Icon*)pEmbedObj)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001181 return TRUE;
1182}
1183
Tom Sepezba038bc2015-10-08 12:03:00 -07001184FX_BOOL Document::icons(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001185 CJS_PropValue& vp,
1186 CFX_WideString& sError) {
1187 if (vp.IsSetting()) {
1188 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1189 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1190 return FALSE;
1191 }
1192
Tom Sepez6ba32d92016-01-05 16:26:32 -08001193 if (m_IconList.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001194 vp.SetNull();
1195 return TRUE;
1196 }
1197
Tom Sepez67fd5df2015-10-08 12:24:19 -07001198 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
1199 CJS_Array Icons(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001200
Tom Sepez6ba32d92016-01-05 16:26:32 -08001201 int i = 0;
1202 for (const auto& pIconElement : m_IconList) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001203 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001204 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001205 if (pObj.IsEmpty())
1206 return FALSE;
1207
Tom Sepezd5a0e952015-09-17 15:40:06 -07001208 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001209 if (!pJS_Icon)
1210 return FALSE;
1211
1212 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1213 if (!pIcon)
1214 return FALSE;
1215
1216 pIcon->SetStream(pIconElement->IconStream->GetStream());
1217 pIcon->SetIconName(pIconElement->IconName);
Tom Sepez6ba32d92016-01-05 16:26:32 -08001218 Icons.SetElement(i++, CJS_Value(pRuntime, pJS_Icon));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001219 }
1220
1221 vp << Icons;
1222 return TRUE;
1223}
1224
Tom Sepezba038bc2015-10-08 12:03:00 -07001225FX_BOOL Document::getIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001226 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001227 CJS_Value& vRet,
1228 CFX_WideString& sError) {
1229 CJS_Context* pContext = (CJS_Context*)cc;
1230 if (params.size() != 1) {
1231 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1232 return FALSE;
1233 }
1234
Tom Sepez6ba32d92016-01-05 16:26:32 -08001235 if (m_IconList.empty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001236 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001237
Tom Sepez6ba32d92016-01-05 16:26:32 -08001238 CFX_WideString swIconName = params[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001239 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1240
Tom Sepez6ba32d92016-01-05 16:26:32 -08001241 for (const auto& pIconElement : m_IconList) {
1242 if (pIconElement->IconName == swIconName) {
1243 Icon* pRetIcon = pIconElement->IconStream;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001244
Tom Sepez39bfe122015-09-17 15:25:23 -07001245 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001246 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001247 if (pObj.IsEmpty())
1248 return FALSE;
1249
Tom Sepezd5a0e952015-09-17 15:40:06 -07001250 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001251 if (!pJS_Icon)
1252 return FALSE;
1253
1254 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1255 if (!pIcon)
1256 return FALSE;
1257
1258 pIcon->SetIconName(swIconName);
1259 pIcon->SetStream(pRetIcon->GetStream());
1260 vRet = pJS_Icon;
1261 return TRUE;
1262 }
1263 }
1264
1265 return FALSE;
1266}
1267
Tom Sepezba038bc2015-10-08 12:03:00 -07001268FX_BOOL Document::removeIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001269 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001270 CJS_Value& vRet,
1271 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001272 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001273 return TRUE;
1274}
1275
Tom Sepezba038bc2015-10-08 12:03:00 -07001276FX_BOOL Document::createDataObject(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001277 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001278 CJS_Value& vRet,
1279 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001280 // Unsafe, not implemented.
1281 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001282}
1283
Tom Sepezba038bc2015-10-08 12:03:00 -07001284FX_BOOL Document::media(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001285 CJS_PropValue& vp,
1286 CFX_WideString& sError) {
1287 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001288}
1289
Tom Sepezba038bc2015-10-08 12:03:00 -07001290FX_BOOL Document::calculateNow(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001291 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001292 CJS_Value& vRet,
1293 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001294 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001295 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001296 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001297 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001298
tsepez23ae4a52016-06-08 20:44:54 -07001299 CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001300 pInterForm->OnCalculate();
1301 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001302}
1303
Tom Sepezba038bc2015-10-08 12:03:00 -07001304FX_BOOL Document::Collab(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::getPageNthWord(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_EXTRACT_ACCESS))
1315 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -07001316
Lei Zhangdd734de2015-11-11 10:16:52 -08001317 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
1318 int nWordNo = params.size() > 1 ? params[1].ToInt() : 0;
1319 bool bStrip = params.size() > 2 ? params[2].ToBool() : true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001320
Tom Sepez50d12ad2015-11-24 09:50:51 -08001321 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001322 if (!pDocument)
1323 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001324
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001325 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1326 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1327 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1328 return FALSE;
1329 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001330
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001331 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1332 if (!pPageDict)
1333 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001334
thestig5cc24652016-04-26 11:46:02 -07001335 CPDF_Page page(pDocument, pPageDict, true);
1336 page.ParseContent();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001337
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001338 int nWords = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001339 CFX_WideString swRet;
Tom Sepez2398d892016-02-17 16:46:26 -08001340 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001341 if (pPageObj->IsText()) {
1342 CPDF_TextObject* pTextObj = pPageObj->AsText();
Tom Sepez2398d892016-02-17 16:46:26 -08001343 int nObjWords = CountWords(pTextObj);
1344 if (nWords + nObjWords >= nWordNo) {
1345 swRet = GetObjWordStr(pTextObj, nWordNo - nWords);
1346 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001347 }
Tom Sepez2398d892016-02-17 16:46:26 -08001348 nWords += nObjWords;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001349 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001350 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001351
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001352 if (bStrip) {
1353 swRet.TrimLeft();
1354 swRet.TrimRight();
1355 }
1356
1357 vRet = swRet.c_str();
1358 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001359}
1360
Tom Sepezba038bc2015-10-08 12:03:00 -07001361FX_BOOL Document::getPageNthWordQuads(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001362 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001363 CJS_Value& vRet,
1364 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001365 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1366 return FALSE;
1367
1368 return FALSE;
1369}
1370
Tom Sepezba038bc2015-10-08 12:03:00 -07001371FX_BOOL Document::getPageNumWords(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001372 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001373 CJS_Value& vRet,
1374 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001375 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1376 return FALSE;
1377
Lei Zhangdd734de2015-11-11 10:16:52 -08001378 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
Tom Sepez50d12ad2015-11-24 09:50:51 -08001379 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001380 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1381 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1382 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1383 return FALSE;
1384 }
1385
1386 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1387 if (!pPageDict)
1388 return FALSE;
1389
thestig5cc24652016-04-26 11:46:02 -07001390 CPDF_Page page(pDocument, pPageDict, true);
1391 page.ParseContent();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001392
1393 int nWords = 0;
Tom Sepez2398d892016-02-17 16:46:26 -08001394 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001395 if (pPageObj->IsText())
1396 nWords += CountWords(pPageObj->AsText());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001397 }
1398
1399 vRet = nWords;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001400 return TRUE;
1401}
1402
Tom Sepezba038bc2015-10-08 12:03:00 -07001403FX_BOOL Document::getPrintParams(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001404 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001405 CJS_Value& vRet,
1406 CFX_WideString& sError) {
1407 CJS_Context* pContext = (CJS_Context*)cc;
1408 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez39bfe122015-09-17 15:25:23 -07001409 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001410 pRuntime->GetIsolate(), pRuntime, CJS_PrintParamsObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001411
1412 // Not implemented yet.
1413
1414 vRet = pRetObj;
1415 return TRUE;
1416}
1417
1418#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
1419
1420int Document::CountWords(CPDF_TextObject* pTextObj) {
1421 if (!pTextObj)
1422 return 0;
1423
1424 int nWords = 0;
1425
1426 CPDF_Font* pFont = pTextObj->GetFont();
1427 if (!pFont)
1428 return 0;
1429
1430 FX_BOOL bIsLatin = FALSE;
1431
1432 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001433 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001434 FX_FLOAT kerning;
1435
1436 pTextObj->GetCharInfo(i, charcode, kerning);
1437 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1438
Tom Sepez62a70f92016-03-21 15:00:20 -07001439 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001440 if (swUnicode.GetLength() > 0)
1441 unicode = swUnicode[0];
1442
1443 if (ISLATINWORD(unicode) && bIsLatin)
1444 continue;
1445
1446 bIsLatin = ISLATINWORD(unicode);
1447 if (unicode != 0x20)
1448 nWords++;
1449 }
1450
1451 return nWords;
1452}
1453
1454CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj,
1455 int nWordIndex) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001456 CFX_WideString swRet;
1457
1458 CPDF_Font* pFont = pTextObj->GetFont();
1459 if (!pFont)
1460 return L"";
1461
1462 int nWords = 0;
1463 FX_BOOL bIsLatin = FALSE;
1464
1465 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001466 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001467 FX_FLOAT kerning;
1468
1469 pTextObj->GetCharInfo(i, charcode, kerning);
1470 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1471
Tom Sepez62a70f92016-03-21 15:00:20 -07001472 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001473 if (swUnicode.GetLength() > 0)
1474 unicode = swUnicode[0];
1475
1476 if (ISLATINWORD(unicode) && bIsLatin) {
1477 } else {
1478 bIsLatin = ISLATINWORD(unicode);
1479 if (unicode != 0x20)
1480 nWords++;
1481 }
1482
1483 if (nWords - 1 == nWordIndex)
1484 swRet += unicode;
1485 }
1486
1487 return swRet;
1488}
1489
Tom Sepezba038bc2015-10-08 12:03:00 -07001490FX_BOOL Document::zoom(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001491 CJS_PropValue& vp,
1492 CFX_WideString& sError) {
1493 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001494}
1495
1496/**
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001497(none, NoVary)
1498(fitP, FitPage)
1499(fitW, FitWidth)
1500(fitH, FitHeight)
1501(fitV, FitVisibleWidth)
1502(pref, Preferred)
1503(refW, ReflowWidth)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001504*/
1505
Tom Sepezba038bc2015-10-08 12:03:00 -07001506FX_BOOL Document::zoomType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001507 CJS_PropValue& vp,
1508 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001509 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001510}
1511
Tom Sepezba038bc2015-10-08 12:03:00 -07001512FX_BOOL Document::deletePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001513 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001514 CJS_Value& vRet,
1515 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001516 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001517 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001518}
JUN FANG33f6f0d2015-04-06 12:39:51 -07001519
Tom Sepezba038bc2015-10-08 12:03:00 -07001520FX_BOOL Document::extractPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001521 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001522 CJS_Value& vRet,
1523 CFX_WideString& sError) {
1524 // Unsafe, not supported.
1525 return TRUE;
1526}
1527
Tom Sepezba038bc2015-10-08 12:03:00 -07001528FX_BOOL Document::insertPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001529 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001530 CJS_Value& vRet,
1531 CFX_WideString& sError) {
1532 // Unsafe, not supported.
1533 return TRUE;
1534}
1535
Tom Sepezba038bc2015-10-08 12:03:00 -07001536FX_BOOL Document::replacePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001537 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001538 CJS_Value& vRet,
1539 CFX_WideString& sError) {
1540 // Unsafe, not supported.
1541 return TRUE;
1542}
1543
Tom Sepezba038bc2015-10-08 12:03:00 -07001544FX_BOOL Document::getURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001545 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001546 CJS_Value& vRet,
1547 CFX_WideString& sError) {
1548 // Unsafe, not supported.
1549 return TRUE;
1550}
1551
1552void Document::AddDelayData(CJS_DelayData* pData) {
Tom Sepez56c10192016-03-15 12:34:17 -07001553 m_DelayData.push_back(std::unique_ptr<CJS_DelayData>(pData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001554}
1555
1556void Document::DoFieldDelay(const CFX_WideString& sFieldName,
1557 int nControlIndex) {
Tom Sepez56c10192016-03-15 12:34:17 -07001558 std::vector<std::unique_ptr<CJS_DelayData>> DelayDataForFieldAndControlIndex;
1559 auto iter = m_DelayData.begin();
1560 while (iter != m_DelayData.end()) {
1561 auto old = iter++;
1562 if ((*old)->sFieldName == sFieldName &&
1563 (*old)->nControlIndex == nControlIndex) {
1564 DelayDataForFieldAndControlIndex.push_back(std::move(*old));
1565 m_DelayData.erase(old);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001566 }
1567 }
1568
Tom Sepez56c10192016-03-15 12:34:17 -07001569 for (const auto& pData : DelayDataForFieldAndControlIndex)
1570 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001571}
1572
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001573CJS_Document* Document::GetCJSDoc() const {
1574 return static_cast<CJS_Document*>(m_pJSObject);
JUN FANG33f6f0d2015-04-06 12:39:51 -07001575}