1 // 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.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef FPDFSDK_JAVASCRIPT_DOCUMENT_H_
8 #define FPDFSDK_JAVASCRIPT_DOCUMENT_H_
9 
10 #include <list>
11 #include <memory>
12 #include <vector>
13 
14 #include "core/fpdfapi/fpdf_page/include/cpdf_pageobject.h"
15 #include "core/fpdfapi/fpdf_page/include/cpdf_textobject.h"
16 #include "fpdfsdk/javascript/JS_Define.h"
17 
18 class PrintParamsObj : public CJS_EmbedObj {
19  public:
20   PrintParamsObj(CJS_Object* pJSObject);
~PrintParamsObj()21   ~PrintParamsObj() override {}
22 
23  public:
24   FX_BOOL bUI;
25   int nStart;
26   int nEnd;
27   FX_BOOL bSilent;
28   FX_BOOL bShrinkToFit;
29   FX_BOOL bPrintAsImage;
30   FX_BOOL bReverse;
31   FX_BOOL bAnnotations;
32 };
33 
34 class CJS_PrintParamsObj : public CJS_Object {
35  public:
CJS_PrintParamsObj(v8::Local<v8::Object> pObject)36   CJS_PrintParamsObj(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
~CJS_PrintParamsObj()37   ~CJS_PrintParamsObj() override {}
38 
39   DECLARE_JS_CLASS();
40 };
41 
42 class Icon;
43 class Field;
44 
45 struct IconElement {
IconElementIconElement46   IconElement(const CFX_WideString& name, Icon* stream)
47       : IconName(name), IconStream(stream) {}
48 
49   CFX_WideString IconName;
50   Icon* IconStream;
51 };
52 
53 struct CJS_DelayData;
54 struct CJS_DelayAnnot;
55 struct CJS_AnnotObj;
56 
57 class Document : public CJS_EmbedObj {
58  public:
59   Document(CJS_Object* pJSObject);
60   ~Document() override;
61 
62   FX_BOOL ADBE(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
63   FX_BOOL author(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
64   FX_BOOL baseURL(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
65   FX_BOOL bookmarkRoot(IJS_Context* cc,
66                        CJS_PropValue& vp,
67                        CFX_WideString& sError);
68   FX_BOOL calculate(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
69   FX_BOOL Collab(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
70   FX_BOOL creationDate(IJS_Context* cc,
71                        CJS_PropValue& vp,
72                        CFX_WideString& sError);
73   FX_BOOL creator(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
74   FX_BOOL delay(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
75   FX_BOOL dirty(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
76   FX_BOOL documentFileName(IJS_Context* cc,
77                            CJS_PropValue& vp,
78                            CFX_WideString& sError);
79   FX_BOOL external(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
80   FX_BOOL filesize(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
81   FX_BOOL icons(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
82   FX_BOOL info(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
83   FX_BOOL keywords(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
84   FX_BOOL layout(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
85   FX_BOOL media(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
86   FX_BOOL modDate(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
87   FX_BOOL mouseX(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
88   FX_BOOL mouseY(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
89   FX_BOOL numFields(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
90   FX_BOOL numPages(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
91   FX_BOOL pageNum(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
92   FX_BOOL pageWindowRect(IJS_Context* cc,
93                          CJS_PropValue& vp,
94                          CFX_WideString& sError);
95   FX_BOOL path(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
96   FX_BOOL producer(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
97   FX_BOOL subject(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
98   FX_BOOL title(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
99   FX_BOOL zoom(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
100   FX_BOOL zoomType(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError);
101 
102   FX_BOOL addAnnot(IJS_Context* cc,
103                    const std::vector<CJS_Value>& params,
104                    CJS_Value& vRet,
105                    CFX_WideString& sError);
106   FX_BOOL addField(IJS_Context* cc,
107                    const std::vector<CJS_Value>& params,
108                    CJS_Value& vRet,
109                    CFX_WideString& sError);
110   FX_BOOL addLink(IJS_Context* cc,
111                   const std::vector<CJS_Value>& params,
112                   CJS_Value& vRet,
113                   CFX_WideString& sError);
114   FX_BOOL addIcon(IJS_Context* cc,
115                   const std::vector<CJS_Value>& params,
116                   CJS_Value& vRet,
117                   CFX_WideString& sError);
118   FX_BOOL calculateNow(IJS_Context* cc,
119                        const std::vector<CJS_Value>& params,
120                        CJS_Value& vRet,
121                        CFX_WideString& sError);
122   FX_BOOL closeDoc(IJS_Context* cc,
123                    const std::vector<CJS_Value>& params,
124                    CJS_Value& vRet,
125                    CFX_WideString& sError);
126   FX_BOOL createDataObject(IJS_Context* cc,
127                            const std::vector<CJS_Value>& params,
128                            CJS_Value& vRet,
129                            CFX_WideString& sError);
130   FX_BOOL deletePages(IJS_Context* cc,
131                       const std::vector<CJS_Value>& params,
132                       CJS_Value& vRet,
133                       CFX_WideString& sError);
134   FX_BOOL exportAsText(IJS_Context* cc,
135                        const std::vector<CJS_Value>& params,
136                        CJS_Value& vRet,
137                        CFX_WideString& sError);
138   FX_BOOL exportAsFDF(IJS_Context* cc,
139                       const std::vector<CJS_Value>& params,
140                       CJS_Value& vRet,
141                       CFX_WideString& sError);
142   FX_BOOL exportAsXFDF(IJS_Context* cc,
143                        const std::vector<CJS_Value>& params,
144                        CJS_Value& vRet,
145                        CFX_WideString& sError);
146   FX_BOOL extractPages(IJS_Context* cc,
147                        const std::vector<CJS_Value>& params,
148                        CJS_Value& vRet,
149                        CFX_WideString& sError);
150   FX_BOOL getAnnot(IJS_Context* cc,
151                    const std::vector<CJS_Value>& params,
152                    CJS_Value& vRet,
153                    CFX_WideString& sError);
154   FX_BOOL getAnnots(IJS_Context* cc,
155                     const std::vector<CJS_Value>& params,
156                     CJS_Value& vRet,
157                     CFX_WideString& sError);
158   FX_BOOL getAnnot3D(IJS_Context* cc,
159                      const std::vector<CJS_Value>& params,
160                      CJS_Value& vRet,
161                      CFX_WideString& sError);
162   FX_BOOL getAnnots3D(IJS_Context* cc,
163                       const std::vector<CJS_Value>& params,
164                       CJS_Value& vRet,
165                       CFX_WideString& sError);
166   FX_BOOL getField(IJS_Context* cc,
167                    const std::vector<CJS_Value>& params,
168                    CJS_Value& vRet,
169                    CFX_WideString& sError);
170   FX_BOOL getIcon(IJS_Context* cc,
171                   const std::vector<CJS_Value>& params,
172                   CJS_Value& vRet,
173                   CFX_WideString& sError);
174   FX_BOOL getLinks(IJS_Context* cc,
175                    const std::vector<CJS_Value>& params,
176                    CJS_Value& vRet,
177                    CFX_WideString& sError);
178   FX_BOOL getNthFieldName(IJS_Context* cc,
179                           const std::vector<CJS_Value>& params,
180                           CJS_Value& vRet,
181                           CFX_WideString& sError);
182   FX_BOOL getOCGs(IJS_Context* cc,
183                   const std::vector<CJS_Value>& params,
184                   CJS_Value& vRet,
185                   CFX_WideString& sError);
186   FX_BOOL getPageBox(IJS_Context* cc,
187                      const std::vector<CJS_Value>& params,
188                      CJS_Value& vRet,
189                      CFX_WideString& sError);
190   FX_BOOL getPageNthWord(IJS_Context* cc,
191                          const std::vector<CJS_Value>& params,
192                          CJS_Value& vRet,
193                          CFX_WideString& sError);
194   FX_BOOL getPageNthWordQuads(IJS_Context* cc,
195                               const std::vector<CJS_Value>& params,
196                               CJS_Value& vRet,
197                               CFX_WideString& sError);
198   FX_BOOL getPageNumWords(IJS_Context* cc,
199                           const std::vector<CJS_Value>& params,
200                           CJS_Value& vRet,
201                           CFX_WideString& sError);
202   FX_BOOL getPrintParams(IJS_Context* cc,
203                          const std::vector<CJS_Value>& params,
204                          CJS_Value& vRet,
205                          CFX_WideString& sError);
206   FX_BOOL getURL(IJS_Context* cc,
207                  const std::vector<CJS_Value>& params,
208                  CJS_Value& vRet,
209                  CFX_WideString& sError);
210   FX_BOOL importAnFDF(IJS_Context* cc,
211                       const std::vector<CJS_Value>& params,
212                       CJS_Value& vRet,
213                       CFX_WideString& sError);
214   FX_BOOL importAnXFDF(IJS_Context* cc,
215                        const std::vector<CJS_Value>& params,
216                        CJS_Value& vRet,
217                        CFX_WideString& sError);
218   FX_BOOL importTextData(IJS_Context* cc,
219                          const std::vector<CJS_Value>& params,
220                          CJS_Value& vRet,
221                          CFX_WideString& sError);
222   FX_BOOL insertPages(IJS_Context* cc,
223                       const std::vector<CJS_Value>& params,
224                       CJS_Value& vRet,
225                       CFX_WideString& sError);
226   FX_BOOL mailForm(IJS_Context* cc,
227                    const std::vector<CJS_Value>& params,
228                    CJS_Value& vRet,
229                    CFX_WideString& sError);
230   FX_BOOL print(IJS_Context* cc,
231                 const std::vector<CJS_Value>& params,
232                 CJS_Value& vRet,
233                 CFX_WideString& sError);
234   FX_BOOL removeField(IJS_Context* cc,
235                       const std::vector<CJS_Value>& params,
236                       CJS_Value& vRet,
237                       CFX_WideString& sError);
238   FX_BOOL replacePages(IJS_Context* cc,
239                        const std::vector<CJS_Value>& params,
240                        CJS_Value& vRet,
241                        CFX_WideString& sError);
242   FX_BOOL resetForm(IJS_Context* cc,
243                     const std::vector<CJS_Value>& params,
244                     CJS_Value& vRet,
245                     CFX_WideString& sError);
246   FX_BOOL saveAs(IJS_Context* cc,
247                  const std::vector<CJS_Value>& params,
248                  CJS_Value& vRet,
249                  CFX_WideString& sError);
250   FX_BOOL submitForm(IJS_Context* cc,
251                      const std::vector<CJS_Value>& params,
252                      CJS_Value& vRet,
253                      CFX_WideString& sError);
254   FX_BOOL mailDoc(IJS_Context* cc,
255                   const std::vector<CJS_Value>& params,
256                   CJS_Value& vRet,
257                   CFX_WideString& sError);
258   FX_BOOL removeIcon(IJS_Context* cc,
259                      const std::vector<CJS_Value>& params,
260                      CJS_Value& vRet,
261                      CFX_WideString& sError);
262 
263   void AttachDoc(CPDFSDK_Document* pDoc);
264   CPDFSDK_Document* GetReaderDoc();
265   void AddDelayData(CJS_DelayData* pData);
266   void DoFieldDelay(const CFX_WideString& sFieldName, int nControlIndex);
SetIsolate(v8::Isolate * isolate)267   void SetIsolate(v8::Isolate* isolate) { m_isolate = isolate; }
268   CJS_Document* GetCJSDoc() const;
269 
270  private:
271   bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);
272   int CountWords(CPDF_TextObject* pTextObj);
273   CFX_WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
274 
275   v8::Isolate* m_isolate;
276   std::list<std::unique_ptr<IconElement>> m_IconList;
277   CPDFSDK_Document* m_pDocument;
278   CFX_WideString m_cwBaseURL;
279   bool m_bDelay;
280   std::list<std::unique_ptr<CJS_DelayData>> m_DelayData;
281 };
282 
283 class CJS_Document : public CJS_Object {
284  public:
CJS_Document(v8::Local<v8::Object> pObject)285   explicit CJS_Document(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
~CJS_Document()286   ~CJS_Document() override {}
287 
288   // CJS_Object
289   void InitInstance(IJS_Runtime* pIRuntime) override;
290 
291   DECLARE_JS_CLASS();
292 
293   JS_STATIC_PROP(ADBE, Document);
294   JS_STATIC_PROP(author, Document);
295   JS_STATIC_PROP(baseURL, Document);
296   JS_STATIC_PROP(bookmarkRoot, Document);
297   JS_STATIC_PROP(calculate, Document);
298   JS_STATIC_PROP(Collab, Document);
299   JS_STATIC_PROP(creationDate, Document);
300   JS_STATIC_PROP(creator, Document);
301   JS_STATIC_PROP(delay, Document);
302   JS_STATIC_PROP(dirty, Document);
303   JS_STATIC_PROP(documentFileName, Document);
304   JS_STATIC_PROP(external, Document);
305   JS_STATIC_PROP(filesize, Document);
306   JS_STATIC_PROP(icons, Document);
307   JS_STATIC_PROP(info, Document);
308   JS_STATIC_PROP(keywords, Document);
309   JS_STATIC_PROP(layout, Document);
310   JS_STATIC_PROP(media, Document);
311   JS_STATIC_PROP(modDate, Document);
312   JS_STATIC_PROP(mouseX, Document);
313   JS_STATIC_PROP(mouseY, Document);
314   JS_STATIC_PROP(numFields, Document);
315   JS_STATIC_PROP(numPages, Document);
316   JS_STATIC_PROP(pageNum, Document);
317   JS_STATIC_PROP(pageWindowRect, Document);
318   JS_STATIC_PROP(path, Document);
319   JS_STATIC_PROP(producer, Document);
320   JS_STATIC_PROP(subject, Document);
321   JS_STATIC_PROP(title, Document);
322   JS_STATIC_PROP(zoom, Document);
323   JS_STATIC_PROP(zoomType, Document);
324 
325   JS_STATIC_METHOD(addAnnot, Document);
326   JS_STATIC_METHOD(addField, Document);
327   JS_STATIC_METHOD(addLink, Document);
328   JS_STATIC_METHOD(addIcon, Document);
329   JS_STATIC_METHOD(calculateNow, Document);
330   JS_STATIC_METHOD(closeDoc, Document);
331   JS_STATIC_METHOD(createDataObject, Document);
332   JS_STATIC_METHOD(deletePages, Document);
333   JS_STATIC_METHOD(exportAsText, Document);
334   JS_STATIC_METHOD(exportAsFDF, Document);
335   JS_STATIC_METHOD(exportAsXFDF, Document);
336   JS_STATIC_METHOD(extractPages, Document);
337   JS_STATIC_METHOD(getAnnot, Document);
338   JS_STATIC_METHOD(getAnnots, Document);
339   JS_STATIC_METHOD(getAnnot3D, Document);
340   JS_STATIC_METHOD(getAnnots3D, Document);
341   JS_STATIC_METHOD(getField, Document);
342   JS_STATIC_METHOD(getIcon, Document);
343   JS_STATIC_METHOD(getLinks, Document);
344   JS_STATIC_METHOD(getNthFieldName, Document);
345   JS_STATIC_METHOD(getOCGs, Document);
346   JS_STATIC_METHOD(getPageBox, Document);
347   JS_STATIC_METHOD(getPageNthWord, Document);
348   JS_STATIC_METHOD(getPageNthWordQuads, Document);
349   JS_STATIC_METHOD(getPageNumWords, Document);
350   JS_STATIC_METHOD(getPrintParams, Document);
351   JS_STATIC_METHOD(getURL, Document);
352   JS_STATIC_METHOD(importAnFDF, Document);
353   JS_STATIC_METHOD(importAnXFDF, Document);
354   JS_STATIC_METHOD(importTextData, Document);
355   JS_STATIC_METHOD(insertPages, Document);
356   JS_STATIC_METHOD(mailForm, Document);
357   JS_STATIC_METHOD(print, Document);
358   JS_STATIC_METHOD(removeField, Document);
359   JS_STATIC_METHOD(replacePages, Document);
360   JS_STATIC_METHOD(removeIcon, Document);
361   JS_STATIC_METHOD(resetForm, Document);
362   JS_STATIC_METHOD(saveAs, Document);
363   JS_STATIC_METHOD(submitForm, Document);
364   JS_STATIC_METHOD(mailDoc, Document);
365 };
366 
367 #endif  // FPDFSDK_JAVASCRIPT_DOCUMENT_H_
368