Use std::set<> to track active event handlers.
[pdfium.git] / fpdfsdk / include / javascript / JS_Runtime.h
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_INCLUDE_JAVASCRIPT_JS_RUNTIME_H_
8 #define FPDFSDK_INCLUDE_JAVASCRIPT_JS_RUNTIME_H_
9
10 #include <set>
11 #include <utility>
12
13 #include "../../../third_party/base/nonstd_unique_ptr.h"
14 #include "../../../core/include/fxcrt/fx_basic.h"
15 #include "../jsapi/fxjs_v8.h"
16 #include "IJavaScript.h"
17 #include "JS_EventHandler.h"
18
19 class CJS_Context;
20
21 class CJS_Runtime : public IFXJS_Runtime {
22  public:
23   using FieldEvent = std::pair<CFX_WideString, JS_EVENT_T>;
24
25   explicit CJS_Runtime(CPDFDoc_Environment* pApp);
26   ~CJS_Runtime() override;
27
28   // IFXJS_Runtime
29   IFXJS_Context* NewContext() override;
30   void ReleaseContext(IFXJS_Context* pContext) override;
31   IFXJS_Context* GetCurrentContext() override;
32   void SetReaderDocument(CPDFSDK_Document* pReaderDoc) override;
33   CPDFSDK_Document* GetReaderDocument() override { return m_pDocument; }
34
35   CPDFDoc_Environment* GetReaderApp() const { return m_pApp; }
36
37   // Returns true if the event isn't already found in the set.
38   bool AddEventToSet(const FieldEvent& event);
39   void RemoveEventFromSet(const FieldEvent& event);
40
41   void BeginBlock() { m_bBlocking = TRUE; }
42   void EndBlock() { m_bBlocking = FALSE; }
43   FX_BOOL IsBlocking() const { return m_bBlocking; }
44
45   v8::Isolate* GetIsolate() const { return m_isolate; }
46   v8::Local<v8::Context> NewJSContext();
47
48  private:
49   void DefineJSObjects();
50
51   CFX_ArrayTemplate<CJS_Context*> m_ContextArray;
52   CPDFDoc_Environment* m_pApp;
53   CPDFSDK_Document* m_pDocument;
54   FX_BOOL m_bBlocking;
55   std::set<FieldEvent> m_FieldEventSet;
56   v8::Isolate* m_isolate;
57   bool m_isolateManaged;
58   nonstd::unique_ptr<FXJS_ArrayBufferAllocator> m_pArrayBufferAllocator;
59   v8::Global<v8::Context> m_context;
60 };
61
62 #endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_RUNTIME_H_