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 FXJSE_SCOPE_INLINE_H_
8 #define FXJSE_SCOPE_INLINE_H_
9 #include "runtime.h"
10 #include "context.h"
11 class CFXJSE_ScopeUtil_IsolateHandle {
12  protected:
13   v8::Isolate* m_isolate;
14   v8::Locker m_locker;
15   v8::Isolate::Scope m_iscope;
16   v8::HandleScope m_hscope;
17 
18  public:
CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate * pIsolate)19   explicit CFXJSE_ScopeUtil_IsolateHandle(v8::Isolate* pIsolate)
20       : m_isolate(pIsolate),
21         m_locker(pIsolate),
22         m_iscope(pIsolate),
23         m_hscope(pIsolate) {}
GetIsolate()24   v8::Isolate* GetIsolate() { return m_isolate; }
25 
26  private:
27   CFXJSE_ScopeUtil_IsolateHandle(const CFXJSE_ScopeUtil_IsolateHandle&);
28   void operator=(const CFXJSE_ScopeUtil_IsolateHandle&);
29   void* operator new(size_t size);
30   void operator delete(void*, size_t);
31 };
32 class CFXJSE_ScopeUtil_IsolateHandleRootContext {
33   CFXJSE_ScopeUtil_IsolateHandle m_parent;
34   v8::Context::Scope m_cscope;
35 
36  public:
CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate * pIsolate)37   explicit CFXJSE_ScopeUtil_IsolateHandleRootContext(v8::Isolate* pIsolate)
38       : m_parent(pIsolate),
39         m_cscope(v8::Local<v8::Context>::New(
40             pIsolate,
41             CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
42 
43  private:
44   CFXJSE_ScopeUtil_IsolateHandleRootContext(
45       const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
46   void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootContext&);
47   void* operator new(size_t size);
48   void operator delete(void*, size_t);
49 };
50 class CFXJSE_ScopeUtil_IsolateHandleContext {
51   CFXJSE_Context* m_context;
52   CFXJSE_ScopeUtil_IsolateHandle m_parent;
53   v8::Context::Scope m_cscope;
54 
55  public:
CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context * pContext)56   explicit CFXJSE_ScopeUtil_IsolateHandleContext(CFXJSE_Context* pContext)
57       : m_context(pContext),
58         m_parent(pContext->m_pIsolate),
59         m_cscope(v8::Local<v8::Context>::New(pContext->m_pIsolate,
60                                              pContext->m_hContext)) {}
GetIsolate()61   v8::Isolate* GetIsolate() { return m_context->m_pIsolate; }
GetLocalContext()62   v8::Local<v8::Context> GetLocalContext() {
63     return v8::Local<v8::Context>::New(m_context->m_pIsolate,
64                                        m_context->m_hContext);
65   }
66 
67  private:
68   CFXJSE_ScopeUtil_IsolateHandleContext(
69       const CFXJSE_ScopeUtil_IsolateHandleContext&);
70   void operator=(const CFXJSE_ScopeUtil_IsolateHandleContext&);
71   void* operator new(size_t size);
72   void operator delete(void*, size_t);
73 };
74 class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext {
75   CFXJSE_Context* m_context;
76   CFXJSE_ScopeUtil_IsolateHandle m_parent;
77   v8::Context::Scope m_cscope;
78 
79  public:
CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(v8::Isolate * pIsolate,CFXJSE_Context * pContext)80   explicit CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
81       v8::Isolate* pIsolate,
82       CFXJSE_Context* pContext)
83       : m_context(pContext),
84         m_parent(pIsolate),
85         m_cscope(v8::Local<v8::Context>::New(
86             pIsolate,
87             pContext ? pContext->m_hContext
88                      : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext)) {}
GetIsolate()89   v8::Isolate* GetIsolate() { return m_parent.GetIsolate(); }
GetLocalContext()90   v8::Local<v8::Context> GetLocalContext() {
91     v8::Isolate* pIsolate = m_parent.GetIsolate();
92     return v8::Local<v8::Context>::New(
93         pIsolate, m_context
94                       ? m_context->m_hContext
95                       : CFXJSE_RuntimeData::Get(pIsolate)->m_hRootContext);
96   }
97 
98  private:
99   CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext(
100       const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
101   void operator=(const CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext&);
102   void* operator new(size_t size);
103   void operator delete(void*, size_t);
104 };
105 #endif
106