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