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