// Copyright 2016 The PDFium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef FXJS_XFA_CFXJSE_CONTEXT_H_ #define FXJS_XFA_CFXJSE_CONTEXT_H_ #include #include #include "core/fxcrt/bytestring.h" #include "core/fxcrt/unowned_ptr.h" #include "v8/include/cppgc/persistent.h" #include "v8/include/v8-forward.h" #include "v8/include/v8-persistent-handle.h" class CFXJSE_Class; class CFXJSE_HostObject; class CFXJSE_Value; class CXFA_ThisProxy; struct FXJSE_CLASS_DESCRIPTOR; class CFXJSE_Context { public: struct ExecutionResult { ExecutionResult(); ExecutionResult(bool sts, std::unique_ptr val); ExecutionResult(ExecutionResult&& that) noexcept; ExecutionResult& operator=(ExecutionResult&& that) noexcept; ~ExecutionResult(); bool status = false; std::unique_ptr value; }; static std::unique_ptr Create( v8::Isolate* pIsolate, const FXJSE_CLASS_DESCRIPTOR* pGlobalClass, CFXJSE_HostObject* pGlobalObject, CXFA_ThisProxy* pProxy); ~CFXJSE_Context(); v8::Isolate* GetIsolate() const { return m_pIsolate; } v8::Local GetContext(); v8::Local GetGlobalObject(); void AddClass(std::unique_ptr pClass); CFXJSE_Class* GetClassByName(ByteStringView szName) const; void EnableCompatibleMode(); // Note: `pNewThisObject` may be empty. ExecutionResult ExecuteScript(ByteStringView bsScript, v8::Local pNewThisObject); private: CFXJSE_Context(v8::Isolate* pIsolate, CXFA_ThisProxy* pProxy); CFXJSE_Context(const CFXJSE_Context&) = delete; CFXJSE_Context& operator=(const CFXJSE_Context&) = delete; v8::Global m_hContext; UnownedPtr m_pIsolate; std::vector> m_rgClasses; cppgc::Persistent m_pProxy; }; void FXJSE_UpdateObjectBinding(v8::Local hObject, CFXJSE_HostObject* pNewBinding); void FXJSE_ClearObjectBinding(v8::Local hJSObject); CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(v8::Local hValue); #endif // FXJS_XFA_CFXJSE_CONTEXT_H_