blob: 762ba71cf23e4f1012198747e51b5350d128ddb6 [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;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700787 CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey, bsKey.GetLength());
Dan Sinclair710c9092015-10-21 15:46:10 -0400788
789 if (pValueObj->IsString() || pValueObj->IsName()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700790 FXJS_PutObjectString(isolate, pObj, wsKey.c_str(),
791 pValueObj->GetUnicodeText().c_str());
Dan Sinclair710c9092015-10-21 15:46:10 -0400792 } else if (pValueObj->IsNumber()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700793 FXJS_PutObjectNumber(isolate, pObj, wsKey.c_str(),
794 (float)pValueObj->GetNumber());
Dan Sinclair710c9092015-10-21 15:46:10 -0400795 } else if (pValueObj->IsBoolean()) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700796 FXJS_PutObjectBoolean(isolate, pObj, wsKey.c_str(),
Wei Li97da9762016-03-11 17:00:48 -0800797 !!pValueObj->GetInteger());
Dan Sinclair05d9e932015-10-20 16:44:57 -0400798 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700799 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700800 vp << pObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700801 }
Tom Sepezdfbf8e72015-10-14 14:17:26 -0700802 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700803}
804
Tom Sepezba038bc2015-10-08 12:03:00 -0700805FX_BOOL Document::creationDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700806 CJS_PropValue& vp,
807 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800808 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700809 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700810 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700811
812 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800813 vp << pDictionary->GetUnicodeTextBy("CreationDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700814 } else {
815 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
816 return FALSE;
817
818 CFX_WideString csCreationDate;
819 vp >> csCreationDate;
820 pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
821 m_pDocument->SetChangeMark();
822 }
823 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700824}
825
Tom Sepezba038bc2015-10-08 12:03:00 -0700826FX_BOOL Document::creator(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700827 CJS_PropValue& vp,
828 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800829 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700830 if (!pDictionary)
831 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -0700832
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700833 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800834 vp << pDictionary->GetUnicodeTextBy("Creator");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700835 } else {
836 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
837 return FALSE;
838
839 CFX_WideString csCreator;
840 vp >> csCreator;
841 pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
842 m_pDocument->SetChangeMark();
843 }
844 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700845}
846
Tom Sepezba038bc2015-10-08 12:03:00 -0700847FX_BOOL Document::delay(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700848 CJS_PropValue& vp,
849 CFX_WideString& sError) {
850 if (vp.IsGetting()) {
851 vp << m_bDelay;
852 } else {
853 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
854 return FALSE;
855
856 vp >> m_bDelay;
857 if (m_bDelay) {
Tom Sepez56c10192016-03-15 12:34:17 -0700858 m_DelayData.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700859 } else {
Tom Sepez56c10192016-03-15 12:34:17 -0700860 std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
861 DelayDataToProcess.swap(m_DelayData);
862 for (const auto& pData : DelayDataToProcess)
863 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700864 }
865 }
866 return TRUE;
867}
868
Tom Sepezba038bc2015-10-08 12:03:00 -0700869FX_BOOL Document::keywords(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 CJS_PropValue& vp,
871 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800872 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700873 if (!pDictionary)
874 return FALSE;
875
876 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800877 vp << pDictionary->GetUnicodeTextBy("Keywords");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700878 } else {
879 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
880 return FALSE;
881
882 CFX_WideString csKeywords;
883 vp >> csKeywords;
884 pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
885 m_pDocument->SetChangeMark();
886 }
887 return TRUE;
888}
889
Tom Sepezba038bc2015-10-08 12:03:00 -0700890FX_BOOL Document::modDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700891 CJS_PropValue& vp,
892 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800893 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700894 if (!pDictionary)
895 return FALSE;
896
897 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800898 vp << pDictionary->GetUnicodeTextBy("ModDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700899 } else {
900 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
901 return FALSE;
902
903 CFX_WideString csmodDate;
904 vp >> csmodDate;
905 pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
906 m_pDocument->SetChangeMark();
907 }
908 return TRUE;
909}
910
Tom Sepezba038bc2015-10-08 12:03:00 -0700911FX_BOOL Document::producer(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700912 CJS_PropValue& vp,
913 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800914 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700915 if (!pDictionary)
916 return FALSE;
917
918 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800919 vp << pDictionary->GetUnicodeTextBy("Producer");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700920 } else {
921 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
922 return FALSE;
923
924 CFX_WideString csproducer;
925 vp >> csproducer;
926 pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
927 m_pDocument->SetChangeMark();
928 }
929 return TRUE;
930}
931
Tom Sepezba038bc2015-10-08 12:03:00 -0700932FX_BOOL Document::subject(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700933 CJS_PropValue& vp,
934 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800935 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700936 if (!pDictionary)
937 return FALSE;
938
939 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800940 vp << pDictionary->GetUnicodeTextBy("Subject");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700941 } else {
942 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
943 return FALSE;
944
945 CFX_WideString cssubject;
946 vp >> cssubject;
947 pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
948 m_pDocument->SetChangeMark();
949 }
950 return TRUE;
951}
952
Tom Sepezba038bc2015-10-08 12:03:00 -0700953FX_BOOL Document::title(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700954 CJS_PropValue& vp,
955 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800956 if (!m_pDocument || !m_pDocument->GetUnderlyingDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700957 return FALSE;
958
Tom Sepez50d12ad2015-11-24 09:50:51 -0800959 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700960 if (!pDictionary)
961 return FALSE;
962
963 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800964 vp << pDictionary->GetUnicodeTextBy("Title");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700965 } else {
966 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
967 return FALSE;
968
969 CFX_WideString cstitle;
970 vp >> cstitle;
971 pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
972 m_pDocument->SetChangeMark();
973 }
974 return TRUE;
975}
976
Tom Sepezba038bc2015-10-08 12:03:00 -0700977FX_BOOL Document::numPages(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978 CJS_PropValue& vp,
979 CFX_WideString& sError) {
980 if (vp.IsSetting()) {
981 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
982 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
983 return FALSE;
984 }
985 vp << m_pDocument->GetPageCount();
986 return TRUE;
987}
988
Tom Sepezba038bc2015-10-08 12:03:00 -0700989FX_BOOL Document::external(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700990 CJS_PropValue& vp,
991 CFX_WideString& sError) {
992 // In Chrome case,should always return true.
993 if (vp.IsGetting()) {
994 vp << true;
995 }
996 return TRUE;
997}
998
Tom Sepezba038bc2015-10-08 12:03:00 -0700999FX_BOOL Document::filesize(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001000 CJS_PropValue& vp,
1001 CFX_WideString& sError) {
1002 if (vp.IsSetting()) {
1003 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1004 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1005 return FALSE;
1006 }
1007 vp << 0;
1008 return TRUE;
1009}
1010
Tom Sepezba038bc2015-10-08 12:03:00 -07001011FX_BOOL Document::mouseX(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001012 CJS_PropValue& vp,
1013 CFX_WideString& sError) {
1014 return TRUE;
1015}
1016
Tom Sepezba038bc2015-10-08 12:03:00 -07001017FX_BOOL Document::mouseY(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001018 CJS_PropValue& vp,
1019 CFX_WideString& sError) {
1020 return TRUE;
1021}
1022
Tom Sepezba038bc2015-10-08 12:03:00 -07001023FX_BOOL Document::baseURL(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001024 CJS_PropValue& vp,
1025 CFX_WideString& sError) {
1026 if (vp.IsGetting()) {
1027 vp << m_cwBaseURL;
1028 } else {
1029 vp >> m_cwBaseURL;
1030 }
1031 return TRUE;
1032}
1033
Tom Sepezba038bc2015-10-08 12:03:00 -07001034FX_BOOL Document::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001035 CJS_PropValue& vp,
1036 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001037 CPDFSDK_InterForm* pInterForm =
1038 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001039
1040 if (vp.IsGetting()) {
1041 if (pInterForm->IsCalculateEnabled())
1042 vp << true;
1043 else
1044 vp << false;
1045 } else {
1046 bool bCalculate;
1047 vp >> bCalculate;
1048
1049 pInterForm->EnableCalculate(bCalculate);
1050 }
1051
1052 return TRUE;
1053}
1054
Tom Sepezba038bc2015-10-08 12:03:00 -07001055FX_BOOL Document::documentFileName(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001056 CJS_PropValue& vp,
1057 CFX_WideString& sError) {
1058 if (vp.IsSetting()) {
1059 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1060 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1061 return FALSE;
1062 }
1063 CFX_WideString wsFilePath = m_pDocument->GetPath();
1064 int32_t i = wsFilePath.GetLength() - 1;
1065 for (; i >= 0; i--) {
1066 if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/')
1067 break;
1068 }
1069 if (i >= 0 && i < wsFilePath.GetLength() - 1) {
1070 vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1);
1071 } else {
1072 vp << L"";
1073 }
1074 return TRUE;
1075}
1076
Tom Sepezba038bc2015-10-08 12:03:00 -07001077FX_BOOL Document::path(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001078 CJS_PropValue& vp,
1079 CFX_WideString& sError) {
1080 if (vp.IsSetting()) {
1081 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1082 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1083 return FALSE;
1084 }
1085 vp << app::SysPathToPDFPath(m_pDocument->GetPath());
1086 return TRUE;
1087}
1088
Tom Sepezba038bc2015-10-08 12:03:00 -07001089FX_BOOL Document::pageWindowRect(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001090 CJS_PropValue& vp,
1091 CFX_WideString& sError) {
1092 return TRUE;
1093}
1094
Tom Sepezba038bc2015-10-08 12:03:00 -07001095FX_BOOL Document::layout(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001096 CJS_PropValue& vp,
1097 CFX_WideString& sError) {
1098 return TRUE;
1099}
1100
Tom Sepezba038bc2015-10-08 12:03:00 -07001101FX_BOOL Document::addLink(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::closeDoc(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) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001112 return TRUE;
1113}
1114
Tom Sepezba038bc2015-10-08 12:03:00 -07001115FX_BOOL Document::getPageBox(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001116 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001117 CJS_Value& vRet,
1118 CFX_WideString& sError) {
1119 return TRUE;
1120}
1121
Tom Sepezba038bc2015-10-08 12:03:00 -07001122FX_BOOL Document::getAnnot(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001123 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001124 CJS_Value& vRet,
1125 CFX_WideString& sError) {
1126 return TRUE;
1127}
1128
Tom Sepezba038bc2015-10-08 12:03:00 -07001129FX_BOOL Document::getAnnots(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001130 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001131 CJS_Value& vRet,
1132 CFX_WideString& sError) {
1133 vRet.SetNull();
1134 return TRUE;
1135}
1136
Tom Sepezba038bc2015-10-08 12:03:00 -07001137FX_BOOL Document::getAnnot3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001138 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001139 CJS_Value& vRet,
1140 CFX_WideString& sError) {
1141 vRet.SetNull();
1142 return TRUE;
1143}
1144
Tom Sepezba038bc2015-10-08 12:03:00 -07001145FX_BOOL Document::getAnnots3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001146 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001147 CJS_Value& vRet,
1148 CFX_WideString& sError) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001149 vRet = CJS_Value::VT_undefined;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001150 return TRUE;
1151}
1152
Tom Sepezba038bc2015-10-08 12:03:00 -07001153FX_BOOL Document::getOCGs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001154 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001155 CJS_Value& vRet,
1156 CFX_WideString& sError) {
1157 return TRUE;
1158}
1159
Tom Sepezba038bc2015-10-08 12:03:00 -07001160FX_BOOL Document::getLinks(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001161 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001162 CJS_Value& vRet,
1163 CFX_WideString& sError) {
1164 return TRUE;
1165}
1166
1167bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) {
1168 return (rect.left <= LinkRect.left && rect.top <= LinkRect.top &&
1169 rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom);
1170}
1171
Tom Sepezba038bc2015-10-08 12:03:00 -07001172FX_BOOL Document::addIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001173 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001174 CJS_Value& vRet,
1175 CFX_WideString& sError) {
1176 CJS_Context* pContext = (CJS_Context*)cc;
1177 if (params.size() != 2) {
1178 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1179 return FALSE;
1180 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001181 CFX_WideString swIconName = params[0].ToCFXWideString();
Tom Sepezaecd9d02015-08-31 15:04:12 -07001182
Tom Sepez39bfe122015-09-17 15:25:23 -07001183 if (params[1].GetType() != CJS_Value::VT_object) {
Tom Sepezaecd9d02015-08-31 15:04:12 -07001184 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1185 return FALSE;
1186 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001187
Tom Sepezcd56a7d2015-10-06 11:45:28 -07001188 v8::Local<v8::Object> pJSIcon = params[1].ToV8Object();
1189 if (FXJS_GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001190 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1191 return FALSE;
1192 }
1193
1194 CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
1195 if (!pEmbedObj) {
1196 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1197 return FALSE;
1198 }
1199
Tom Sepez6ba32d92016-01-05 16:26:32 -08001200 m_IconList.push_back(std::unique_ptr<IconElement>(
1201 new IconElement(swIconName, (Icon*)pEmbedObj)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001202 return TRUE;
1203}
1204
Tom Sepezba038bc2015-10-08 12:03:00 -07001205FX_BOOL Document::icons(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001206 CJS_PropValue& vp,
1207 CFX_WideString& sError) {
1208 if (vp.IsSetting()) {
1209 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1210 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1211 return FALSE;
1212 }
1213
Tom Sepez6ba32d92016-01-05 16:26:32 -08001214 if (m_IconList.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001215 vp.SetNull();
1216 return TRUE;
1217 }
1218
Tom Sepez67fd5df2015-10-08 12:24:19 -07001219 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
1220 CJS_Array Icons(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001221
Tom Sepez6ba32d92016-01-05 16:26:32 -08001222 int i = 0;
1223 for (const auto& pIconElement : m_IconList) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001224 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001225 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001226 if (pObj.IsEmpty())
1227 return FALSE;
1228
Tom Sepezd5a0e952015-09-17 15:40:06 -07001229 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001230 if (!pJS_Icon)
1231 return FALSE;
1232
1233 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1234 if (!pIcon)
1235 return FALSE;
1236
1237 pIcon->SetStream(pIconElement->IconStream->GetStream());
1238 pIcon->SetIconName(pIconElement->IconName);
Tom Sepez6ba32d92016-01-05 16:26:32 -08001239 Icons.SetElement(i++, CJS_Value(pRuntime, pJS_Icon));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001240 }
1241
1242 vp << Icons;
1243 return TRUE;
1244}
1245
Tom Sepezba038bc2015-10-08 12:03:00 -07001246FX_BOOL Document::getIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001247 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001248 CJS_Value& vRet,
1249 CFX_WideString& sError) {
1250 CJS_Context* pContext = (CJS_Context*)cc;
1251 if (params.size() != 1) {
1252 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1253 return FALSE;
1254 }
1255
Tom Sepez6ba32d92016-01-05 16:26:32 -08001256 if (m_IconList.empty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001257 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001258
Tom Sepez6ba32d92016-01-05 16:26:32 -08001259 CFX_WideString swIconName = params[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001260 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1261
Tom Sepez6ba32d92016-01-05 16:26:32 -08001262 for (const auto& pIconElement : m_IconList) {
1263 if (pIconElement->IconName == swIconName) {
1264 Icon* pRetIcon = pIconElement->IconStream;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001265
Tom Sepez39bfe122015-09-17 15:25:23 -07001266 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001267 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001268 if (pObj.IsEmpty())
1269 return FALSE;
1270
Tom Sepezd5a0e952015-09-17 15:40:06 -07001271 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001272 if (!pJS_Icon)
1273 return FALSE;
1274
1275 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1276 if (!pIcon)
1277 return FALSE;
1278
1279 pIcon->SetIconName(swIconName);
1280 pIcon->SetStream(pRetIcon->GetStream());
1281 vRet = pJS_Icon;
1282 return TRUE;
1283 }
1284 }
1285
1286 return FALSE;
1287}
1288
Tom Sepezba038bc2015-10-08 12:03:00 -07001289FX_BOOL Document::removeIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001290 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001291 CJS_Value& vRet,
1292 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001293 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001294 return TRUE;
1295}
1296
Tom Sepezba038bc2015-10-08 12:03:00 -07001297FX_BOOL Document::createDataObject(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001298 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001299 CJS_Value& vRet,
1300 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001301 // Unsafe, not implemented.
1302 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001303}
1304
Tom Sepezba038bc2015-10-08 12:03:00 -07001305FX_BOOL Document::media(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001306 CJS_PropValue& vp,
1307 CFX_WideString& sError) {
1308 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001309}
1310
Tom Sepezba038bc2015-10-08 12:03:00 -07001311FX_BOOL Document::calculateNow(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001312 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001313 CJS_Value& vRet,
1314 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001315 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001316 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001317 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001318 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001319
1320 CPDFSDK_InterForm* pInterForm =
1321 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001322 pInterForm->OnCalculate();
1323 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001324}
1325
Tom Sepezba038bc2015-10-08 12:03:00 -07001326FX_BOOL Document::Collab(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001327 CJS_PropValue& vp,
1328 CFX_WideString& sError) {
1329 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001330}
1331
Tom Sepezba038bc2015-10-08 12:03:00 -07001332FX_BOOL Document::getPageNthWord(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001333 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001334 CJS_Value& vRet,
1335 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001336 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1337 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -07001338
Lei Zhangdd734de2015-11-11 10:16:52 -08001339 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
1340 int nWordNo = params.size() > 1 ? params[1].ToInt() : 0;
1341 bool bStrip = params.size() > 2 ? params[2].ToBool() : true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001342
Tom Sepez50d12ad2015-11-24 09:50:51 -08001343 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001344 if (!pDocument)
1345 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001346
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001347 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1348 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1349 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1350 return FALSE;
1351 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001352
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001353 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1354 if (!pPageDict)
1355 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001356
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001357 CPDF_Page page;
1358 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001359 page.ParseContent(nullptr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001360
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001361 int nWords = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001362 CFX_WideString swRet;
Tom Sepez2398d892016-02-17 16:46:26 -08001363 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001364 if (pPageObj->IsText()) {
1365 CPDF_TextObject* pTextObj = pPageObj->AsText();
Tom Sepez2398d892016-02-17 16:46:26 -08001366 int nObjWords = CountWords(pTextObj);
1367 if (nWords + nObjWords >= nWordNo) {
1368 swRet = GetObjWordStr(pTextObj, nWordNo - nWords);
1369 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001370 }
Tom Sepez2398d892016-02-17 16:46:26 -08001371 nWords += nObjWords;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001372 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001373 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001374
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001375 if (bStrip) {
1376 swRet.TrimLeft();
1377 swRet.TrimRight();
1378 }
1379
1380 vRet = swRet.c_str();
1381 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001382}
1383
Tom Sepezba038bc2015-10-08 12:03:00 -07001384FX_BOOL Document::getPageNthWordQuads(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001385 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001386 CJS_Value& vRet,
1387 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001388 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1389 return FALSE;
1390
1391 return FALSE;
1392}
1393
Tom Sepezba038bc2015-10-08 12:03:00 -07001394FX_BOOL Document::getPageNumWords(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001395 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001396 CJS_Value& vRet,
1397 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001398 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1399 return FALSE;
1400
Lei Zhangdd734de2015-11-11 10:16:52 -08001401 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
Tom Sepez50d12ad2015-11-24 09:50:51 -08001402 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001403 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1404 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1405 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1406 return FALSE;
1407 }
1408
1409 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1410 if (!pPageDict)
1411 return FALSE;
1412
1413 CPDF_Page page;
1414 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001415 page.ParseContent(nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001416
1417 int nWords = 0;
Tom Sepez2398d892016-02-17 16:46:26 -08001418 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001419 if (pPageObj->IsText())
1420 nWords += CountWords(pPageObj->AsText());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001421 }
1422
1423 vRet = nWords;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001424 return TRUE;
1425}
1426
Tom Sepezba038bc2015-10-08 12:03:00 -07001427FX_BOOL Document::getPrintParams(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001428 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001429 CJS_Value& vRet,
1430 CFX_WideString& sError) {
1431 CJS_Context* pContext = (CJS_Context*)cc;
1432 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez39bfe122015-09-17 15:25:23 -07001433 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001434 pRuntime->GetIsolate(), pRuntime, CJS_PrintParamsObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001435
1436 // Not implemented yet.
1437
1438 vRet = pRetObj;
1439 return TRUE;
1440}
1441
1442#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
1443
1444int Document::CountWords(CPDF_TextObject* pTextObj) {
1445 if (!pTextObj)
1446 return 0;
1447
1448 int nWords = 0;
1449
1450 CPDF_Font* pFont = pTextObj->GetFont();
1451 if (!pFont)
1452 return 0;
1453
1454 FX_BOOL bIsLatin = FALSE;
1455
1456 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001457 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001458 FX_FLOAT kerning;
1459
1460 pTextObj->GetCharInfo(i, charcode, kerning);
1461 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1462
Tom Sepez62a70f92016-03-21 15:00:20 -07001463 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001464 if (swUnicode.GetLength() > 0)
1465 unicode = swUnicode[0];
1466
1467 if (ISLATINWORD(unicode) && bIsLatin)
1468 continue;
1469
1470 bIsLatin = ISLATINWORD(unicode);
1471 if (unicode != 0x20)
1472 nWords++;
1473 }
1474
1475 return nWords;
1476}
1477
1478CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj,
1479 int nWordIndex) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001480 CFX_WideString swRet;
1481
1482 CPDF_Font* pFont = pTextObj->GetFont();
1483 if (!pFont)
1484 return L"";
1485
1486 int nWords = 0;
1487 FX_BOOL bIsLatin = FALSE;
1488
1489 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001490 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001491 FX_FLOAT kerning;
1492
1493 pTextObj->GetCharInfo(i, charcode, kerning);
1494 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1495
Tom Sepez62a70f92016-03-21 15:00:20 -07001496 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001497 if (swUnicode.GetLength() > 0)
1498 unicode = swUnicode[0];
1499
1500 if (ISLATINWORD(unicode) && bIsLatin) {
1501 } else {
1502 bIsLatin = ISLATINWORD(unicode);
1503 if (unicode != 0x20)
1504 nWords++;
1505 }
1506
1507 if (nWords - 1 == nWordIndex)
1508 swRet += unicode;
1509 }
1510
1511 return swRet;
1512}
1513
Tom Sepezba038bc2015-10-08 12:03:00 -07001514FX_BOOL Document::zoom(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001515 CJS_PropValue& vp,
1516 CFX_WideString& sError) {
1517 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001518}
1519
1520/**
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001521(none, NoVary)
1522(fitP, FitPage)
1523(fitW, FitWidth)
1524(fitH, FitHeight)
1525(fitV, FitVisibleWidth)
1526(pref, Preferred)
1527(refW, ReflowWidth)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001528*/
1529
Tom Sepezba038bc2015-10-08 12:03:00 -07001530FX_BOOL Document::zoomType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001531 CJS_PropValue& vp,
1532 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001533 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001534}
1535
Tom Sepezba038bc2015-10-08 12:03:00 -07001536FX_BOOL Document::deletePages(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) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001540 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001541 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001542}
JUN FANG33f6f0d2015-04-06 12:39:51 -07001543
Tom Sepezba038bc2015-10-08 12:03:00 -07001544FX_BOOL Document::extractPages(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
Tom Sepezba038bc2015-10-08 12:03:00 -07001552FX_BOOL Document::insertPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001553 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001554 CJS_Value& vRet,
1555 CFX_WideString& sError) {
1556 // Unsafe, not supported.
1557 return TRUE;
1558}
1559
Tom Sepezba038bc2015-10-08 12:03:00 -07001560FX_BOOL Document::replacePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001561 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001562 CJS_Value& vRet,
1563 CFX_WideString& sError) {
1564 // Unsafe, not supported.
1565 return TRUE;
1566}
1567
Tom Sepezba038bc2015-10-08 12:03:00 -07001568FX_BOOL Document::getURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001569 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001570 CJS_Value& vRet,
1571 CFX_WideString& sError) {
1572 // Unsafe, not supported.
1573 return TRUE;
1574}
1575
1576void Document::AddDelayData(CJS_DelayData* pData) {
Tom Sepez56c10192016-03-15 12:34:17 -07001577 m_DelayData.push_back(std::unique_ptr<CJS_DelayData>(pData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001578}
1579
1580void Document::DoFieldDelay(const CFX_WideString& sFieldName,
1581 int nControlIndex) {
Tom Sepez56c10192016-03-15 12:34:17 -07001582 std::vector<std::unique_ptr<CJS_DelayData>> DelayDataForFieldAndControlIndex;
1583 auto iter = m_DelayData.begin();
1584 while (iter != m_DelayData.end()) {
1585 auto old = iter++;
1586 if ((*old)->sFieldName == sFieldName &&
1587 (*old)->nControlIndex == nControlIndex) {
1588 DelayDataForFieldAndControlIndex.push_back(std::move(*old));
1589 m_DelayData.erase(old);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001590 }
1591 }
1592
Tom Sepez56c10192016-03-15 12:34:17 -07001593 for (const auto& pData : DelayDataForFieldAndControlIndex)
1594 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001595}
1596
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001597CJS_Document* Document::GetCJSDoc() const {
1598 return static_cast<CJS_Document*>(m_pJSObject);
JUN FANG33f6f0d2015-04-06 12:39:51 -07001599}