1 // Copyright 2016 The PDFium Authors 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 FXJS_XFA_CFXJSE_CONTEXT_H_ 8 #define FXJS_XFA_CFXJSE_CONTEXT_H_ 9 10 #include <memory> 11 #include <vector> 12 13 #include "core/fxcrt/bytestring.h" 14 #include "core/fxcrt/unowned_ptr.h" 15 #include "v8/include/cppgc/persistent.h" 16 #include "v8/include/v8-forward.h" 17 #include "v8/include/v8-persistent-handle.h" 18 19 class CFXJSE_Class; 20 class CFXJSE_HostObject; 21 class CFXJSE_Value; 22 class CXFA_ThisProxy; 23 struct FXJSE_CLASS_DESCRIPTOR; 24 25 class CFXJSE_Context { 26 public: 27 struct ExecutionResult { 28 ExecutionResult(); 29 ExecutionResult(bool sts, std::unique_ptr<CFXJSE_Value> val); 30 ExecutionResult(ExecutionResult&& that) noexcept; 31 ExecutionResult& operator=(ExecutionResult&& that) noexcept; 32 ~ExecutionResult(); 33 34 bool status = false; 35 std::unique_ptr<CFXJSE_Value> value; 36 }; 37 38 static std::unique_ptr<CFXJSE_Context> Create( 39 v8::Isolate* pIsolate, 40 const FXJSE_CLASS_DESCRIPTOR* pGlobalClass, 41 CFXJSE_HostObject* pGlobalObject, 42 CXFA_ThisProxy* pProxy); 43 44 ~CFXJSE_Context(); 45 GetIsolate()46 v8::Isolate* GetIsolate() const { return m_pIsolate; } 47 v8::Local<v8::Context> GetContext(); 48 v8::Local<v8::Object> GetGlobalObject(); 49 50 void AddClass(std::unique_ptr<CFXJSE_Class> pClass); 51 CFXJSE_Class* GetClassByName(ByteStringView szName) const; 52 void EnableCompatibleMode(); 53 54 // Note: `pNewThisObject` may be empty. 55 ExecutionResult ExecuteScript(ByteStringView bsScript, 56 v8::Local<v8::Object> pNewThisObject); 57 58 private: 59 CFXJSE_Context(v8::Isolate* pIsolate, CXFA_ThisProxy* pProxy); 60 CFXJSE_Context(const CFXJSE_Context&) = delete; 61 CFXJSE_Context& operator=(const CFXJSE_Context&) = delete; 62 63 v8::Global<v8::Context> m_hContext; 64 UnownedPtr<v8::Isolate> m_pIsolate; 65 std::vector<std::unique_ptr<CFXJSE_Class>> m_rgClasses; 66 cppgc::Persistent<CXFA_ThisProxy> m_pProxy; 67 }; 68 69 void FXJSE_UpdateObjectBinding(v8::Local<v8::Object> hObject, 70 CFXJSE_HostObject* pNewBinding); 71 72 void FXJSE_ClearObjectBinding(v8::Local<v8::Object> hJSObject); 73 CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(v8::Local<v8::Value> hValue); 74 75 #endif // FXJS_XFA_CFXJSE_CONTEXT_H_ 76