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_SRC_JAVASCRIPT_JS_RUNTIME_H_ 8 #define FPDFSDK_SRC_JAVASCRIPT_JS_RUNTIME_H_ 9 10 #include <set> 11 #include <utility> 12 #include <vector> 13 14 #include "JS_EventHandler.h" 15 #include "core/include/fxcrt/fx_basic.h" 16 #include "fpdfsdk/include/javascript/IJavaScript.h" 17 #include "fpdfsdk/include/jsapi/fxjs_v8.h" 18 19 class CJS_Context; 20 21 class CJS_Runtime : public IJS_Runtime { 22 public: 23 class Observer { 24 public: 25 virtual void OnDestroyed() = 0; 26 27 protected: ~Observer()28 virtual ~Observer() {} 29 }; 30 31 using FieldEvent = std::pair<CFX_WideString, JS_EVENT_T>; 32 33 static CJS_Runtime* FromContext(const IJS_Context* cc); 34 35 explicit CJS_Runtime(CPDFDoc_Environment* pApp); 36 ~CJS_Runtime() override; 37 38 // IJS_Runtime 39 IJS_Context* NewContext() override; 40 void ReleaseContext(IJS_Context* pContext) override; 41 IJS_Context* GetCurrentContext() override; 42 void SetReaderDocument(CPDFSDK_Document* pReaderDoc) override; GetReaderDocument()43 CPDFSDK_Document* GetReaderDocument() override { return m_pDocument; } 44 int Execute(IJS_Context* cc, 45 const wchar_t* script, 46 CFX_WideString* info) override; 47 GetReaderApp()48 CPDFDoc_Environment* GetReaderApp() const { return m_pApp; } 49 50 // Returns true if the event isn't already found in the set. 51 bool AddEventToSet(const FieldEvent& event); 52 void RemoveEventFromSet(const FieldEvent& event); 53 BeginBlock()54 void BeginBlock() { m_bBlocking = TRUE; } EndBlock()55 void EndBlock() { m_bBlocking = FALSE; } IsBlocking()56 FX_BOOL IsBlocking() const { return m_bBlocking; } 57 GetIsolate()58 v8::Isolate* GetIsolate() const { return m_isolate; } 59 v8::Local<v8::Context> NewJSContext(); 60 61 #ifdef PDF_ENABLE_XFA 62 FX_BOOL GetHValueByName(const CFX_ByteStringC& utf8Name, 63 FXJSE_HVALUE hValue) override; 64 FX_BOOL SetHValueByName(const CFX_ByteStringC& utf8Name, 65 FXJSE_HVALUE hValue) override; 66 #endif // PDF_ENABLE_XFA 67 68 void AddObserver(Observer* observer); 69 void RemoveObserver(Observer* observer); 70 71 private: 72 void DefineJSObjects(); 73 74 CFX_ArrayTemplate<CJS_Context*> m_ContextArray; 75 CPDFDoc_Environment* m_pApp; 76 CPDFSDK_Document* m_pDocument; 77 FX_BOOL m_bBlocking; 78 std::set<FieldEvent> m_FieldEventSet; 79 v8::Isolate* m_isolate; 80 bool m_isolateManaged; 81 v8::Global<v8::Context> m_context; 82 std::vector<v8::Global<v8::Object>*> m_StaticObjects; 83 std::set<Observer*> m_observers; 84 }; 85 86 #endif // FPDFSDK_SRC_JAVASCRIPT_JS_RUNTIME_H_ 87