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_APP_H_ 8 #define FPDFSDK_JAVASCRIPT_APP_H_ 9 10 #include <memory> 11 #include <unordered_set> 12 #include <vector> 13 14 #include "fpdfsdk/javascript/JS_Define.h" 15 16 class CJS_Runtime; 17 class GlobalTimer; 18 19 class TimerObj : public CJS_EmbedObj { 20 public: 21 explicit TimerObj(CJS_Object* pJSObject); 22 ~TimerObj() override; 23 24 void SetTimer(GlobalTimer* pTimer); GetTimerID()25 int GetTimerID() const { return m_nTimerID; } 26 27 private: 28 int m_nTimerID; // Weak reference to GlobalTimer through global map. 29 }; 30 31 class CJS_TimerObj : public CJS_Object { 32 public: CJS_TimerObj(v8::Local<v8::Object> pObject)33 explicit CJS_TimerObj(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} ~CJS_TimerObj()34 ~CJS_TimerObj() override {} 35 36 DECLARE_JS_CLASS(); 37 }; 38 39 class app : public CJS_EmbedObj { 40 public: 41 explicit app(CJS_Object* pJSObject); 42 ~app() override; 43 44 bool activeDocs(CJS_Runtime* pRuntime, 45 CJS_PropValue& vp, 46 CFX_WideString& sError); 47 bool calculate(CJS_Runtime* pRuntime, 48 CJS_PropValue& vp, 49 CFX_WideString& sError); 50 bool formsVersion(CJS_Runtime* pRuntime, 51 CJS_PropValue& vp, 52 CFX_WideString& sError); 53 bool fs(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); 54 bool fullscreen(CJS_Runtime* pRuntime, 55 CJS_PropValue& vp, 56 CFX_WideString& sError); 57 bool language(CJS_Runtime* pRuntime, 58 CJS_PropValue& vp, 59 CFX_WideString& sError); 60 bool media(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_WideString& sError); 61 bool platform(CJS_Runtime* pRuntime, 62 CJS_PropValue& vp, 63 CFX_WideString& sError); 64 bool runtimeHighlight(CJS_Runtime* pRuntime, 65 CJS_PropValue& vp, 66 CFX_WideString& sError); 67 bool viewerType(CJS_Runtime* pRuntime, 68 CJS_PropValue& vp, 69 CFX_WideString& sError); 70 bool viewerVariation(CJS_Runtime* pRuntime, 71 CJS_PropValue& vp, 72 CFX_WideString& sError); 73 bool viewerVersion(CJS_Runtime* pRuntime, 74 CJS_PropValue& vp, 75 CFX_WideString& sError); 76 77 bool alert(CJS_Runtime* pRuntime, 78 const std::vector<CJS_Value>& params, 79 CJS_Value& vRet, 80 CFX_WideString& sError); 81 bool beep(CJS_Runtime* pRuntime, 82 const std::vector<CJS_Value>& params, 83 CJS_Value& vRet, 84 CFX_WideString& sError); 85 bool browseForDoc(CJS_Runtime* pRuntime, 86 const std::vector<CJS_Value>& params, 87 CJS_Value& vRet, 88 CFX_WideString& sError); 89 bool clearInterval(CJS_Runtime* pRuntime, 90 const std::vector<CJS_Value>& params, 91 CJS_Value& vRet, 92 CFX_WideString& sError); 93 bool clearTimeOut(CJS_Runtime* pRuntime, 94 const std::vector<CJS_Value>& params, 95 CJS_Value& vRet, 96 CFX_WideString& sError); 97 bool execDialog(CJS_Runtime* pRuntime, 98 const std::vector<CJS_Value>& params, 99 CJS_Value& vRet, 100 CFX_WideString& sError); 101 bool execMenuItem(CJS_Runtime* pRuntime, 102 const std::vector<CJS_Value>& params, 103 CJS_Value& vRet, 104 CFX_WideString& sError); 105 bool findComponent(CJS_Runtime* pRuntime, 106 const std::vector<CJS_Value>& params, 107 CJS_Value& vRet, 108 CFX_WideString& sError); 109 bool goBack(CJS_Runtime* pRuntime, 110 const std::vector<CJS_Value>& params, 111 CJS_Value& vRet, 112 CFX_WideString& sError); 113 bool goForward(CJS_Runtime* pRuntime, 114 const std::vector<CJS_Value>& params, 115 CJS_Value& vRet, 116 CFX_WideString& sError); 117 bool launchURL(CJS_Runtime* pRuntime, 118 const std::vector<CJS_Value>& params, 119 CJS_Value& vRet, 120 CFX_WideString& sError); 121 bool mailMsg(CJS_Runtime* pRuntime, 122 const std::vector<CJS_Value>& params, 123 CJS_Value& vRet, 124 CFX_WideString& sError); 125 bool newFDF(CJS_Runtime* pRuntime, 126 const std::vector<CJS_Value>& params, 127 CJS_Value& vRet, 128 CFX_WideString& sError); 129 bool newDoc(CJS_Runtime* pRuntime, 130 const std::vector<CJS_Value>& params, 131 CJS_Value& vRet, 132 CFX_WideString& sError); 133 bool openDoc(CJS_Runtime* pRuntime, 134 const std::vector<CJS_Value>& params, 135 CJS_Value& vRet, 136 CFX_WideString& sError); 137 bool openFDF(CJS_Runtime* pRuntime, 138 const std::vector<CJS_Value>& params, 139 CJS_Value& vRet, 140 CFX_WideString& sError); 141 bool popUpMenuEx(CJS_Runtime* pRuntime, 142 const std::vector<CJS_Value>& params, 143 CJS_Value& vRet, 144 CFX_WideString& sError); 145 bool popUpMenu(CJS_Runtime* pRuntime, 146 const std::vector<CJS_Value>& params, 147 CJS_Value& vRet, 148 CFX_WideString& sError); 149 bool response(CJS_Runtime* pRuntime, 150 const std::vector<CJS_Value>& params, 151 CJS_Value& vRet, 152 CFX_WideString& sError); 153 bool setInterval(CJS_Runtime* pRuntime, 154 const std::vector<CJS_Value>& params, 155 CJS_Value& vRet, 156 CFX_WideString& sError); 157 bool setTimeOut(CJS_Runtime* pRuntime, 158 const std::vector<CJS_Value>& params, 159 CJS_Value& vRet, 160 CFX_WideString& sError); 161 162 void TimerProc(GlobalTimer* pTimer); 163 void CancelProc(GlobalTimer* pTimer); 164 165 static CFX_WideString SysPathToPDFPath(const CFX_WideString& sOldPath); 166 167 private: 168 // CJS_EmbedObj 169 void RunJsScript(CJS_Runtime* pRuntime, const CFX_WideString& wsScript); 170 171 void ClearTimerCommon(CJS_Runtime* pRuntime, const CJS_Value& param); 172 173 bool m_bCalculate; 174 bool m_bRuntimeHighLight; 175 std::unordered_set<std::unique_ptr<GlobalTimer>> m_Timers; 176 }; 177 178 class CJS_App : public CJS_Object { 179 public: CJS_App(v8::Local<v8::Object> pObject)180 explicit CJS_App(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {} ~CJS_App()181 ~CJS_App() override {} 182 183 DECLARE_JS_CLASS(); 184 185 JS_STATIC_PROP(activeDocs, app); 186 JS_STATIC_PROP(calculate, app); 187 JS_STATIC_PROP(formsVersion, app); 188 JS_STATIC_PROP(fs, app); 189 JS_STATIC_PROP(fullscreen, app); 190 JS_STATIC_PROP(language, app); 191 JS_STATIC_PROP(media, app); 192 JS_STATIC_PROP(platform, app); 193 JS_STATIC_PROP(runtimeHighlight, app); 194 JS_STATIC_PROP(viewerType, app); 195 JS_STATIC_PROP(viewerVariation, app); 196 JS_STATIC_PROP(viewerVersion, app); 197 198 JS_STATIC_METHOD(alert, app); 199 JS_STATIC_METHOD(beep, app); 200 JS_STATIC_METHOD(browseForDoc, app); 201 JS_STATIC_METHOD(clearInterval, app); 202 JS_STATIC_METHOD(clearTimeOut, app); 203 JS_STATIC_METHOD(execDialog, app); 204 JS_STATIC_METHOD(execMenuItem, app); 205 JS_STATIC_METHOD(findComponent, app); 206 JS_STATIC_METHOD(goBack, app); 207 JS_STATIC_METHOD(goForward, app); 208 JS_STATIC_METHOD(launchURL, app); 209 JS_STATIC_METHOD(mailMsg, app); 210 JS_STATIC_METHOD(newFDF, app); 211 JS_STATIC_METHOD(newDoc, app); 212 JS_STATIC_METHOD(openDoc, app); 213 JS_STATIC_METHOD(openFDF, app); 214 JS_STATIC_METHOD(popUpMenuEx, app); 215 JS_STATIC_METHOD(popUpMenu, app); 216 JS_STATIC_METHOD(response, app); 217 JS_STATIC_METHOD(setInterval, app); 218 JS_STATIC_METHOD(setTimeOut, app); 219 }; 220 221 #endif // FPDFSDK_JAVASCRIPT_APP_H_ 222