blob: 551d649830453986754bd58f8bb23d0219491206 [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);
tsepez018935c2016-04-15 13:15:12 -0700772 FXJS_PutObjectString(isolate, pObj, L"Author", cwAuthor);
773 FXJS_PutObjectString(isolate, pObj, L"Title", cwTitle);
774 FXJS_PutObjectString(isolate, pObj, L"Subject", cwSubject);
775 FXJS_PutObjectString(isolate, pObj, L"Keywords", cwKeywords);
776 FXJS_PutObjectString(isolate, pObj, L"Creator", cwCreator);
777 FXJS_PutObjectString(isolate, pObj, L"Producer", cwProducer);
778 FXJS_PutObjectString(isolate, pObj, L"CreationDate", cwCreationDate);
779 FXJS_PutObjectString(isolate, pObj, L"ModDate", cwModDate);
780 FXJS_PutObjectString(isolate, pObj, L"Trapped", cwTrapped);
Tom Sepezc6ab1722015-02-05 15:27:25 -0800781
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700782 // It's to be compatible to non-standard info dictionary.
Oliver Chang3f1c71f2016-01-11 08:45:31 -0800783 for (const auto& it : *pDictionary) {
784 const CFX_ByteString& bsKey = it.first;
785 CPDF_Object* pValueObj = it.second;
tsepez4c3debb2016-04-08 12:20:38 -0700786 CFX_WideString wsKey = CFX_WideString::FromUTF8(bsKey.AsStringC());
Dan Sinclair710c9092015-10-21 15:46:10 -0400787 if (pValueObj->IsString() || pValueObj->IsName()) {
tsepez018935c2016-04-15 13:15:12 -0700788 FXJS_PutObjectString(isolate, pObj, wsKey, pValueObj->GetUnicodeText());
Dan Sinclair710c9092015-10-21 15:46:10 -0400789 } else if (pValueObj->IsNumber()) {
tsepez018935c2016-04-15 13:15:12 -0700790 FXJS_PutObjectNumber(isolate, pObj, wsKey,
Tom Sepez39bfe122015-09-17 15:25:23 -0700791 (float)pValueObj->GetNumber());
Dan Sinclair710c9092015-10-21 15:46:10 -0400792 } else if (pValueObj->IsBoolean()) {
tsepez018935c2016-04-15 13:15:12 -0700793 FXJS_PutObjectBoolean(isolate, pObj, wsKey, !!pValueObj->GetInteger());
Dan Sinclair05d9e932015-10-20 16:44:57 -0400794 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700795 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700796 vp << pObj;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700797 }
Tom Sepezdfbf8e72015-10-14 14:17:26 -0700798 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700799}
800
Tom Sepezba038bc2015-10-08 12:03:00 -0700801FX_BOOL Document::creationDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700802 CJS_PropValue& vp,
803 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800804 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700805 if (!pDictionary)
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700806 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700807
808 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800809 vp << pDictionary->GetUnicodeTextBy("CreationDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700810 } else {
811 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
812 return FALSE;
813
814 CFX_WideString csCreationDate;
815 vp >> csCreationDate;
816 pDictionary->SetAtString("CreationDate", PDF_EncodeText(csCreationDate));
817 m_pDocument->SetChangeMark();
818 }
819 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700820}
821
Tom Sepezba038bc2015-10-08 12:03:00 -0700822FX_BOOL Document::creator(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700823 CJS_PropValue& vp,
824 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800825 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700826 if (!pDictionary)
827 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -0700828
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700829 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800830 vp << pDictionary->GetUnicodeTextBy("Creator");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700831 } else {
832 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
833 return FALSE;
834
835 CFX_WideString csCreator;
836 vp >> csCreator;
837 pDictionary->SetAtString("Creator", PDF_EncodeText(csCreator));
838 m_pDocument->SetChangeMark();
839 }
840 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700841}
842
Tom Sepezba038bc2015-10-08 12:03:00 -0700843FX_BOOL Document::delay(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700844 CJS_PropValue& vp,
845 CFX_WideString& sError) {
846 if (vp.IsGetting()) {
847 vp << m_bDelay;
848 } else {
849 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
850 return FALSE;
851
852 vp >> m_bDelay;
853 if (m_bDelay) {
Tom Sepez56c10192016-03-15 12:34:17 -0700854 m_DelayData.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700855 } else {
Tom Sepez56c10192016-03-15 12:34:17 -0700856 std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
857 DelayDataToProcess.swap(m_DelayData);
858 for (const auto& pData : DelayDataToProcess)
859 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700860 }
861 }
862 return TRUE;
863}
864
Tom Sepezba038bc2015-10-08 12:03:00 -0700865FX_BOOL Document::keywords(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700866 CJS_PropValue& vp,
867 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800868 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700869 if (!pDictionary)
870 return FALSE;
871
872 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800873 vp << pDictionary->GetUnicodeTextBy("Keywords");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700874 } else {
875 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
876 return FALSE;
877
878 CFX_WideString csKeywords;
879 vp >> csKeywords;
880 pDictionary->SetAtString("Keywords", PDF_EncodeText(csKeywords));
881 m_pDocument->SetChangeMark();
882 }
883 return TRUE;
884}
885
Tom Sepezba038bc2015-10-08 12:03:00 -0700886FX_BOOL Document::modDate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700887 CJS_PropValue& vp,
888 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800889 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700890 if (!pDictionary)
891 return FALSE;
892
893 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800894 vp << pDictionary->GetUnicodeTextBy("ModDate");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700895 } else {
896 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
897 return FALSE;
898
899 CFX_WideString csmodDate;
900 vp >> csmodDate;
901 pDictionary->SetAtString("ModDate", PDF_EncodeText(csmodDate));
902 m_pDocument->SetChangeMark();
903 }
904 return TRUE;
905}
906
Tom Sepezba038bc2015-10-08 12:03:00 -0700907FX_BOOL Document::producer(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700908 CJS_PropValue& vp,
909 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800910 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700911 if (!pDictionary)
912 return FALSE;
913
914 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800915 vp << pDictionary->GetUnicodeTextBy("Producer");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700916 } else {
917 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
918 return FALSE;
919
920 CFX_WideString csproducer;
921 vp >> csproducer;
922 pDictionary->SetAtString("Producer", PDF_EncodeText(csproducer));
923 m_pDocument->SetChangeMark();
924 }
925 return TRUE;
926}
927
Tom Sepezba038bc2015-10-08 12:03:00 -0700928FX_BOOL Document::subject(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700929 CJS_PropValue& vp,
930 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800931 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700932 if (!pDictionary)
933 return FALSE;
934
935 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800936 vp << pDictionary->GetUnicodeTextBy("Subject");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700937 } else {
938 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
939 return FALSE;
940
941 CFX_WideString cssubject;
942 vp >> cssubject;
943 pDictionary->SetAtString("Subject", PDF_EncodeText(cssubject));
944 m_pDocument->SetChangeMark();
945 }
946 return TRUE;
947}
948
Tom Sepezba038bc2015-10-08 12:03:00 -0700949FX_BOOL Document::title(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700950 CJS_PropValue& vp,
951 CFX_WideString& sError) {
Tom Sepez50d12ad2015-11-24 09:50:51 -0800952 if (!m_pDocument || !m_pDocument->GetUnderlyingDocument())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700953 return FALSE;
954
Tom Sepez50d12ad2015-11-24 09:50:51 -0800955 CPDF_Dictionary* pDictionary = m_pDocument->GetPDFDocument()->GetInfo();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700956 if (!pDictionary)
957 return FALSE;
958
959 if (vp.IsGetting()) {
Wei Li9b761132016-01-29 15:44:20 -0800960 vp << pDictionary->GetUnicodeTextBy("Title");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700961 } else {
962 if (!m_pDocument->GetPermissions(FPDFPERM_MODIFY))
963 return FALSE;
964
965 CFX_WideString cstitle;
966 vp >> cstitle;
967 pDictionary->SetAtString("Title", PDF_EncodeText(cstitle));
968 m_pDocument->SetChangeMark();
969 }
970 return TRUE;
971}
972
Tom Sepezba038bc2015-10-08 12:03:00 -0700973FX_BOOL Document::numPages(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700974 CJS_PropValue& vp,
975 CFX_WideString& sError) {
976 if (vp.IsSetting()) {
977 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
978 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
979 return FALSE;
980 }
981 vp << m_pDocument->GetPageCount();
982 return TRUE;
983}
984
Tom Sepezba038bc2015-10-08 12:03:00 -0700985FX_BOOL Document::external(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700986 CJS_PropValue& vp,
987 CFX_WideString& sError) {
988 // In Chrome case,should always return true.
989 if (vp.IsGetting()) {
990 vp << true;
991 }
992 return TRUE;
993}
994
Tom Sepezba038bc2015-10-08 12:03:00 -0700995FX_BOOL Document::filesize(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700996 CJS_PropValue& vp,
997 CFX_WideString& sError) {
998 if (vp.IsSetting()) {
999 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1000 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1001 return FALSE;
1002 }
1003 vp << 0;
1004 return TRUE;
1005}
1006
Tom Sepezba038bc2015-10-08 12:03:00 -07001007FX_BOOL Document::mouseX(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001008 CJS_PropValue& vp,
1009 CFX_WideString& sError) {
1010 return TRUE;
1011}
1012
Tom Sepezba038bc2015-10-08 12:03:00 -07001013FX_BOOL Document::mouseY(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001014 CJS_PropValue& vp,
1015 CFX_WideString& sError) {
1016 return TRUE;
1017}
1018
Tom Sepezba038bc2015-10-08 12:03:00 -07001019FX_BOOL Document::baseURL(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001020 CJS_PropValue& vp,
1021 CFX_WideString& sError) {
1022 if (vp.IsGetting()) {
1023 vp << m_cwBaseURL;
1024 } else {
1025 vp >> m_cwBaseURL;
1026 }
1027 return TRUE;
1028}
1029
Tom Sepezba038bc2015-10-08 12:03:00 -07001030FX_BOOL Document::calculate(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001031 CJS_PropValue& vp,
1032 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001033 CPDFSDK_InterForm* pInterForm =
1034 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001035
1036 if (vp.IsGetting()) {
1037 if (pInterForm->IsCalculateEnabled())
1038 vp << true;
1039 else
1040 vp << false;
1041 } else {
1042 bool bCalculate;
1043 vp >> bCalculate;
1044
1045 pInterForm->EnableCalculate(bCalculate);
1046 }
1047
1048 return TRUE;
1049}
1050
Tom Sepezba038bc2015-10-08 12:03:00 -07001051FX_BOOL Document::documentFileName(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001052 CJS_PropValue& vp,
1053 CFX_WideString& sError) {
1054 if (vp.IsSetting()) {
1055 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1056 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1057 return FALSE;
1058 }
1059 CFX_WideString wsFilePath = m_pDocument->GetPath();
1060 int32_t i = wsFilePath.GetLength() - 1;
1061 for (; i >= 0; i--) {
1062 if (wsFilePath.GetAt(i) == L'\\' || wsFilePath.GetAt(i) == L'/')
1063 break;
1064 }
1065 if (i >= 0 && i < wsFilePath.GetLength() - 1) {
1066 vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i + 1);
1067 } else {
1068 vp << L"";
1069 }
1070 return TRUE;
1071}
1072
Tom Sepezba038bc2015-10-08 12:03:00 -07001073FX_BOOL Document::path(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001074 CJS_PropValue& vp,
1075 CFX_WideString& sError) {
1076 if (vp.IsSetting()) {
1077 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1078 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1079 return FALSE;
1080 }
1081 vp << app::SysPathToPDFPath(m_pDocument->GetPath());
1082 return TRUE;
1083}
1084
Tom Sepezba038bc2015-10-08 12:03:00 -07001085FX_BOOL Document::pageWindowRect(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001086 CJS_PropValue& vp,
1087 CFX_WideString& sError) {
1088 return TRUE;
1089}
1090
Tom Sepezba038bc2015-10-08 12:03:00 -07001091FX_BOOL Document::layout(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001092 CJS_PropValue& vp,
1093 CFX_WideString& sError) {
1094 return TRUE;
1095}
1096
Tom Sepezba038bc2015-10-08 12:03:00 -07001097FX_BOOL Document::addLink(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001098 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001099 CJS_Value& vRet,
1100 CFX_WideString& sError) {
1101 return TRUE;
1102}
1103
Tom Sepezba038bc2015-10-08 12:03:00 -07001104FX_BOOL Document::closeDoc(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001105 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001106 CJS_Value& vRet,
1107 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001108 return TRUE;
1109}
1110
Tom Sepezba038bc2015-10-08 12:03:00 -07001111FX_BOOL Document::getPageBox(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001112 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001113 CJS_Value& vRet,
1114 CFX_WideString& sError) {
1115 return TRUE;
1116}
1117
Tom Sepezba038bc2015-10-08 12:03:00 -07001118FX_BOOL Document::getAnnot(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001119 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001120 CJS_Value& vRet,
1121 CFX_WideString& sError) {
1122 return TRUE;
1123}
1124
Tom Sepezba038bc2015-10-08 12:03:00 -07001125FX_BOOL Document::getAnnots(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001126 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001127 CJS_Value& vRet,
1128 CFX_WideString& sError) {
1129 vRet.SetNull();
1130 return TRUE;
1131}
1132
Tom Sepezba038bc2015-10-08 12:03:00 -07001133FX_BOOL Document::getAnnot3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001134 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001135 CJS_Value& vRet,
1136 CFX_WideString& sError) {
1137 vRet.SetNull();
1138 return TRUE;
1139}
1140
Tom Sepezba038bc2015-10-08 12:03:00 -07001141FX_BOOL Document::getAnnots3D(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001142 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001143 CJS_Value& vRet,
1144 CFX_WideString& sError) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001145 vRet = CJS_Value::VT_undefined;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001146 return TRUE;
1147}
1148
Tom Sepezba038bc2015-10-08 12:03:00 -07001149FX_BOOL Document::getOCGs(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001150 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001151 CJS_Value& vRet,
1152 CFX_WideString& sError) {
1153 return TRUE;
1154}
1155
Tom Sepezba038bc2015-10-08 12:03:00 -07001156FX_BOOL Document::getLinks(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001157 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001158 CJS_Value& vRet,
1159 CFX_WideString& sError) {
1160 return TRUE;
1161}
1162
1163bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) {
1164 return (rect.left <= LinkRect.left && rect.top <= LinkRect.top &&
1165 rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom);
1166}
1167
Tom Sepezba038bc2015-10-08 12:03:00 -07001168FX_BOOL Document::addIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001169 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001170 CJS_Value& vRet,
1171 CFX_WideString& sError) {
1172 CJS_Context* pContext = (CJS_Context*)cc;
1173 if (params.size() != 2) {
1174 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1175 return FALSE;
1176 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001177 CFX_WideString swIconName = params[0].ToCFXWideString();
Tom Sepezaecd9d02015-08-31 15:04:12 -07001178
Tom Sepez39bfe122015-09-17 15:25:23 -07001179 if (params[1].GetType() != CJS_Value::VT_object) {
Tom Sepezaecd9d02015-08-31 15:04:12 -07001180 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1181 return FALSE;
1182 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001183
Tom Sepezcd56a7d2015-10-06 11:45:28 -07001184 v8::Local<v8::Object> pJSIcon = params[1].ToV8Object();
1185 if (FXJS_GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001186 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1187 return FALSE;
1188 }
1189
1190 CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject()->GetEmbedObject();
1191 if (!pEmbedObj) {
1192 sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
1193 return FALSE;
1194 }
1195
Tom Sepez6ba32d92016-01-05 16:26:32 -08001196 m_IconList.push_back(std::unique_ptr<IconElement>(
1197 new IconElement(swIconName, (Icon*)pEmbedObj)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001198 return TRUE;
1199}
1200
Tom Sepezba038bc2015-10-08 12:03:00 -07001201FX_BOOL Document::icons(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001202 CJS_PropValue& vp,
1203 CFX_WideString& sError) {
1204 if (vp.IsSetting()) {
1205 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1206 sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
1207 return FALSE;
1208 }
1209
Tom Sepez6ba32d92016-01-05 16:26:32 -08001210 if (m_IconList.empty()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001211 vp.SetNull();
1212 return TRUE;
1213 }
1214
Tom Sepez67fd5df2015-10-08 12:24:19 -07001215 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
1216 CJS_Array Icons(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001217
Tom Sepez6ba32d92016-01-05 16:26:32 -08001218 int i = 0;
1219 for (const auto& pIconElement : m_IconList) {
Tom Sepez39bfe122015-09-17 15:25:23 -07001220 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001221 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001222 if (pObj.IsEmpty())
1223 return FALSE;
1224
Tom Sepezd5a0e952015-09-17 15:40:06 -07001225 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001226 if (!pJS_Icon)
1227 return FALSE;
1228
1229 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1230 if (!pIcon)
1231 return FALSE;
1232
1233 pIcon->SetStream(pIconElement->IconStream->GetStream());
1234 pIcon->SetIconName(pIconElement->IconName);
Tom Sepez6ba32d92016-01-05 16:26:32 -08001235 Icons.SetElement(i++, CJS_Value(pRuntime, pJS_Icon));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001236 }
1237
1238 vp << Icons;
1239 return TRUE;
1240}
1241
Tom Sepezba038bc2015-10-08 12:03:00 -07001242FX_BOOL Document::getIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001243 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001244 CJS_Value& vRet,
1245 CFX_WideString& sError) {
1246 CJS_Context* pContext = (CJS_Context*)cc;
1247 if (params.size() != 1) {
1248 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
1249 return FALSE;
1250 }
1251
Tom Sepez6ba32d92016-01-05 16:26:32 -08001252 if (m_IconList.empty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001253 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001254
Tom Sepez6ba32d92016-01-05 16:26:32 -08001255 CFX_WideString swIconName = params[0].ToCFXWideString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001256 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
1257
Tom Sepez6ba32d92016-01-05 16:26:32 -08001258 for (const auto& pIconElement : m_IconList) {
1259 if (pIconElement->IconName == swIconName) {
1260 Icon* pRetIcon = pIconElement->IconStream;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001261
Tom Sepez39bfe122015-09-17 15:25:23 -07001262 v8::Local<v8::Object> pObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001263 pRuntime->GetIsolate(), pRuntime, CJS_Icon::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001264 if (pObj.IsEmpty())
1265 return FALSE;
1266
Tom Sepezd5a0e952015-09-17 15:40:06 -07001267 CJS_Icon* pJS_Icon = (CJS_Icon*)FXJS_GetPrivate(m_isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001268 if (!pJS_Icon)
1269 return FALSE;
1270
1271 Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
1272 if (!pIcon)
1273 return FALSE;
1274
1275 pIcon->SetIconName(swIconName);
1276 pIcon->SetStream(pRetIcon->GetStream());
1277 vRet = pJS_Icon;
1278 return TRUE;
1279 }
1280 }
1281
1282 return FALSE;
1283}
1284
Tom Sepezba038bc2015-10-08 12:03:00 -07001285FX_BOOL Document::removeIcon(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001286 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001287 CJS_Value& vRet,
1288 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001289 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001290 return TRUE;
1291}
1292
Tom Sepezba038bc2015-10-08 12:03:00 -07001293FX_BOOL Document::createDataObject(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001294 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001295 CJS_Value& vRet,
1296 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001297 // Unsafe, not implemented.
1298 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001299}
1300
Tom Sepezba038bc2015-10-08 12:03:00 -07001301FX_BOOL Document::media(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001302 CJS_PropValue& vp,
1303 CFX_WideString& sError) {
1304 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001305}
1306
Tom Sepezba038bc2015-10-08 12:03:00 -07001307FX_BOOL Document::calculateNow(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001308 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001309 CJS_Value& vRet,
1310 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001311 if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001312 m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001313 m_pDocument->GetPermissions(FPDFPERM_FILL_FORM)))
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001314 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001315
1316 CPDFSDK_InterForm* pInterForm =
1317 (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001318 pInterForm->OnCalculate();
1319 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001320}
1321
Tom Sepezba038bc2015-10-08 12:03:00 -07001322FX_BOOL Document::Collab(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001323 CJS_PropValue& vp,
1324 CFX_WideString& sError) {
1325 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001326}
1327
Tom Sepezba038bc2015-10-08 12:03:00 -07001328FX_BOOL Document::getPageNthWord(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001329 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001330 CJS_Value& vRet,
1331 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001332 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1333 return FALSE;
Tom Sepeze5350ef2015-04-23 18:14:26 -07001334
Lei Zhangdd734de2015-11-11 10:16:52 -08001335 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
1336 int nWordNo = params.size() > 1 ? params[1].ToInt() : 0;
1337 bool bStrip = params.size() > 2 ? params[2].ToBool() : true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001338
Tom Sepez50d12ad2015-11-24 09:50:51 -08001339 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001340 if (!pDocument)
1341 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001342
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001343 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1344 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1345 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1346 return FALSE;
1347 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001348
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001349 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1350 if (!pPageDict)
1351 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001352
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001353 CPDF_Page page;
1354 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001355 page.ParseContent(nullptr);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001356
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001357 int nWords = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001358 CFX_WideString swRet;
Tom Sepez2398d892016-02-17 16:46:26 -08001359 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001360 if (pPageObj->IsText()) {
1361 CPDF_TextObject* pTextObj = pPageObj->AsText();
Tom Sepez2398d892016-02-17 16:46:26 -08001362 int nObjWords = CountWords(pTextObj);
1363 if (nWords + nObjWords >= nWordNo) {
1364 swRet = GetObjWordStr(pTextObj, nWordNo - nWords);
1365 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001366 }
Tom Sepez2398d892016-02-17 16:46:26 -08001367 nWords += nObjWords;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001368 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001369 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001370
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001371 if (bStrip) {
1372 swRet.TrimLeft();
1373 swRet.TrimRight();
1374 }
1375
1376 vRet = swRet.c_str();
1377 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001378}
1379
Tom Sepezba038bc2015-10-08 12:03:00 -07001380FX_BOOL Document::getPageNthWordQuads(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001381 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001382 CJS_Value& vRet,
1383 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001384 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1385 return FALSE;
1386
1387 return FALSE;
1388}
1389
Tom Sepezba038bc2015-10-08 12:03:00 -07001390FX_BOOL Document::getPageNumWords(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001391 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001392 CJS_Value& vRet,
1393 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001394 if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
1395 return FALSE;
1396
Lei Zhangdd734de2015-11-11 10:16:52 -08001397 int nPageNo = params.size() > 0 ? params[0].ToInt() : 0;
Tom Sepez50d12ad2015-11-24 09:50:51 -08001398 CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001399 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
1400 if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
1401 sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
1402 return FALSE;
1403 }
1404
1405 CPDF_Dictionary* pPageDict = pDocument->GetPage(nPageNo);
1406 if (!pPageDict)
1407 return FALSE;
1408
1409 CPDF_Page page;
1410 page.Load(pDocument, pPageDict);
Tom Sepezb5b2a912016-01-21 11:04:37 -08001411 page.ParseContent(nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001412
1413 int nWords = 0;
Tom Sepez2398d892016-02-17 16:46:26 -08001414 for (auto& pPageObj : *page.GetPageObjectList()) {
Wei Li7cf13c92016-02-19 11:53:03 -08001415 if (pPageObj->IsText())
1416 nWords += CountWords(pPageObj->AsText());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001417 }
1418
1419 vRet = nWords;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001420 return TRUE;
1421}
1422
Tom Sepezba038bc2015-10-08 12:03:00 -07001423FX_BOOL Document::getPrintParams(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001424 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001425 CJS_Value& vRet,
1426 CFX_WideString& sError) {
1427 CJS_Context* pContext = (CJS_Context*)cc;
1428 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
Tom Sepez39bfe122015-09-17 15:25:23 -07001429 v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj(
Tom Sepez33420902015-10-13 15:00:10 -07001430 pRuntime->GetIsolate(), pRuntime, CJS_PrintParamsObj::g_nObjDefnID);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001431
1432 // Not implemented yet.
1433
1434 vRet = pRetObj;
1435 return TRUE;
1436}
1437
1438#define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
1439
1440int Document::CountWords(CPDF_TextObject* pTextObj) {
1441 if (!pTextObj)
1442 return 0;
1443
1444 int nWords = 0;
1445
1446 CPDF_Font* pFont = pTextObj->GetFont();
1447 if (!pFont)
1448 return 0;
1449
1450 FX_BOOL bIsLatin = FALSE;
1451
1452 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001453 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001454 FX_FLOAT kerning;
1455
1456 pTextObj->GetCharInfo(i, charcode, kerning);
1457 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1458
Tom Sepez62a70f92016-03-21 15:00:20 -07001459 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001460 if (swUnicode.GetLength() > 0)
1461 unicode = swUnicode[0];
1462
1463 if (ISLATINWORD(unicode) && bIsLatin)
1464 continue;
1465
1466 bIsLatin = ISLATINWORD(unicode);
1467 if (unicode != 0x20)
1468 nWords++;
1469 }
1470
1471 return nWords;
1472}
1473
1474CFX_WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj,
1475 int nWordIndex) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001476 CFX_WideString swRet;
1477
1478 CPDF_Font* pFont = pTextObj->GetFont();
1479 if (!pFont)
1480 return L"";
1481
1482 int nWords = 0;
1483 FX_BOOL bIsLatin = FALSE;
1484
1485 for (int i = 0, sz = pTextObj->CountChars(); i < sz; i++) {
Wei Li89409932016-03-28 10:33:33 -07001486 uint32_t charcode = CPDF_Font::kInvalidCharCode;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001487 FX_FLOAT kerning;
1488
1489 pTextObj->GetCharInfo(i, charcode, kerning);
1490 CFX_WideString swUnicode = pFont->UnicodeFromCharCode(charcode);
1491
Tom Sepez62a70f92016-03-21 15:00:20 -07001492 uint16_t unicode = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001493 if (swUnicode.GetLength() > 0)
1494 unicode = swUnicode[0];
1495
1496 if (ISLATINWORD(unicode) && bIsLatin) {
1497 } else {
1498 bIsLatin = ISLATINWORD(unicode);
1499 if (unicode != 0x20)
1500 nWords++;
1501 }
1502
1503 if (nWords - 1 == nWordIndex)
1504 swRet += unicode;
1505 }
1506
1507 return swRet;
1508}
1509
Tom Sepezba038bc2015-10-08 12:03:00 -07001510FX_BOOL Document::zoom(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001511 CJS_PropValue& vp,
1512 CFX_WideString& sError) {
1513 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001514}
1515
1516/**
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001517(none, NoVary)
1518(fitP, FitPage)
1519(fitW, FitWidth)
1520(fitH, FitHeight)
1521(fitV, FitVisibleWidth)
1522(pref, Preferred)
1523(refW, ReflowWidth)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001524*/
1525
Tom Sepezba038bc2015-10-08 12:03:00 -07001526FX_BOOL Document::zoomType(IJS_Context* cc,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001527 CJS_PropValue& vp,
1528 CFX_WideString& sError) {
Tom Sepezc6ab1722015-02-05 15:27:25 -08001529 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001530}
1531
Tom Sepezba038bc2015-10-08 12:03:00 -07001532FX_BOOL Document::deletePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001533 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001534 CJS_Value& vRet,
1535 CFX_WideString& sError) {
Tom Sepezdfbf8e72015-10-14 14:17:26 -07001536 // Unsafe, no supported.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001537 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001538}
JUN FANG33f6f0d2015-04-06 12:39:51 -07001539
Tom Sepezba038bc2015-10-08 12:03:00 -07001540FX_BOOL Document::extractPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001541 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001542 CJS_Value& vRet,
1543 CFX_WideString& sError) {
1544 // Unsafe, not supported.
1545 return TRUE;
1546}
1547
Tom Sepezba038bc2015-10-08 12:03:00 -07001548FX_BOOL Document::insertPages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001549 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001550 CJS_Value& vRet,
1551 CFX_WideString& sError) {
1552 // Unsafe, not supported.
1553 return TRUE;
1554}
1555
Tom Sepezba038bc2015-10-08 12:03:00 -07001556FX_BOOL Document::replacePages(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001557 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001558 CJS_Value& vRet,
1559 CFX_WideString& sError) {
1560 // Unsafe, not supported.
1561 return TRUE;
1562}
1563
Tom Sepezba038bc2015-10-08 12:03:00 -07001564FX_BOOL Document::getURL(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -08001565 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001566 CJS_Value& vRet,
1567 CFX_WideString& sError) {
1568 // Unsafe, not supported.
1569 return TRUE;
1570}
1571
1572void Document::AddDelayData(CJS_DelayData* pData) {
Tom Sepez56c10192016-03-15 12:34:17 -07001573 m_DelayData.push_back(std::unique_ptr<CJS_DelayData>(pData));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001574}
1575
1576void Document::DoFieldDelay(const CFX_WideString& sFieldName,
1577 int nControlIndex) {
Tom Sepez56c10192016-03-15 12:34:17 -07001578 std::vector<std::unique_ptr<CJS_DelayData>> DelayDataForFieldAndControlIndex;
1579 auto iter = m_DelayData.begin();
1580 while (iter != m_DelayData.end()) {
1581 auto old = iter++;
1582 if ((*old)->sFieldName == sFieldName &&
1583 (*old)->nControlIndex == nControlIndex) {
1584 DelayDataForFieldAndControlIndex.push_back(std::move(*old));
1585 m_DelayData.erase(old);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001586 }
1587 }
1588
Tom Sepez56c10192016-03-15 12:34:17 -07001589 for (const auto& pData : DelayDataForFieldAndControlIndex)
1590 Field::DoDelay(m_pDocument, pData.get());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001591}
1592
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001593CJS_Document* Document::GetCJSDoc() const {
1594 return static_cast<CJS_Document*>(m_pJSObject);
JUN FANG33f6f0d2015-04-06 12:39:51 -07001595}