|  | // 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 <memory> | 
|  | #include <vector> | 
|  |  | 
|  | #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<CFXJSE_Value> val); | 
|  | ExecutionResult(ExecutionResult&& that) noexcept; | 
|  | ExecutionResult& operator=(ExecutionResult&& that) noexcept; | 
|  | ~ExecutionResult(); | 
|  |  | 
|  | bool status = false; | 
|  | std::unique_ptr<CFXJSE_Value> value; | 
|  | }; | 
|  |  | 
|  | static std::unique_ptr<CFXJSE_Context> 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<v8::Context> GetContext(); | 
|  | v8::Local<v8::Object> GetGlobalObject(); | 
|  |  | 
|  | void AddClass(std::unique_ptr<CFXJSE_Class> pClass); | 
|  | CFXJSE_Class* GetClassByName(ByteStringView szName) const; | 
|  | void EnableCompatibleMode(); | 
|  |  | 
|  | // Note: `pNewThisObject` may be empty. | 
|  | ExecutionResult ExecuteScript(ByteStringView bsScript, | 
|  | v8::Local<v8::Object> 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<v8::Context> m_hContext; | 
|  | UnownedPtr<v8::Isolate> m_pIsolate; | 
|  | std::vector<std::unique_ptr<CFXJSE_Class>> m_rgClasses; | 
|  | cppgc::Persistent<CXFA_ThisProxy> m_pProxy; | 
|  | }; | 
|  |  | 
|  | void FXJSE_UpdateObjectBinding(v8::Local<v8::Object> hObject, | 
|  | CFXJSE_HostObject* pNewBinding); | 
|  |  | 
|  | void FXJSE_ClearObjectBinding(v8::Local<v8::Object> hJSObject); | 
|  | CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(v8::Local<v8::Value> hValue); | 
|  |  | 
|  | #endif  // FXJS_XFA_CFXJSE_CONTEXT_H_ |