| Index: include/AdblockPlus/JsEngine.h |
| =================================================================== |
| --- a/include/AdblockPlus/JsEngine.h |
| +++ b/include/AdblockPlus/JsEngine.h |
| @@ -30,7 +30,6 @@ |
| #include <AdblockPlus/WebRequest.h> |
| #include "tr1_memory.h" |
| -#include "V8ValueHolder.h" |
| namespace v8 |
| { |
| @@ -40,6 +39,7 @@ |
| class Context; |
| template<class T> class Handle; |
| typedef Handle<Value>(*InvocationCallback)(const Arguments &args); |
| + typedef void(*FunctionCallback)(const FunctionCallbackInfo<Value>& info); |
| } |
| namespace AdblockPlus |
| @@ -49,21 +49,63 @@ |
| /** |
| * Shared smart pointer to a `JsEngine` instance. |
| */ |
| - typedef std::tr1::shared_ptr<JsEngine> JsEnginePtr; |
| + typedef std::shared_ptr<JsEngine> JsEnginePtr; |
| + |
| + // These classes are inherited by JsEngine to avoid any mistake in the order of object destroying and |
| + // disposing. The isolate should be disposed after the everything else. v8::Isolate::Scope |
| + // requires a scope, there is no API to "close" it. |
| + class IsolateManagerJsEngine |
| + { |
| + protected: |
| + IsolateManagerJsEngine() |
| + : isolate{v8::Isolate::New()} |
| + { |
| + } |
| + ~IsolateManagerJsEngine() |
| + { |
| + isolate->Dispose(); |
| + } |
| + v8::Isolate* isolate; |
| + }; |
| + |
| + class IsolateScopeJsEngine : protected IsolateManagerJsEngine |
| + { |
| + protected: |
| + IsolateScopeJsEngine() |
| + : isolateScope{isolate} |
| + { |
| + } |
| + ~IsolateScopeJsEngine() |
| + { |
| + } |
| + v8::Isolate::Scope isolateScope; |
| + }; |
| + |
| + class ContextScopeJsEngine : protected IsolateScopeJsEngine |
| + { |
| + protected: |
| + ~ContextScopeJsEngine() |
| + { |
| + } |
| + v8::UniquePersistent<v8::Context> context; |
| + }; |
| /** |
| * JavaScript engine used by `FilterEngine`, wraps v8. |
| */ |
| - class JsEngine : public std::tr1::enable_shared_from_this<JsEngine> |
| + class JsEngine : public std::enable_shared_from_this<JsEngine>, protected ContextScopeJsEngine |
| { |
| friend class JsValue; |
| friend class JsContext; |
| + struct PrivateCtrArg{}; |
| + public: |
| + JsEngine(PrivateCtrArg); |
| + ~JsEngine(); |
| - public: |
| /** |
| * Event callback function. |
| */ |
| - typedef std::tr1::function<void(JsValueList& params)> EventCallback; |
| + typedef std::function<void(JsValueList& params)> EventCallback; |
| /** |
| * Maps events to callback functions. |
| @@ -151,7 +193,7 @@ |
| * the current `JsEngine`. |
| * @return New `JsValue` instance. |
| */ |
| - JsValuePtr NewCallback(v8::InvocationCallback callback); |
| + JsValuePtr NewCallback(v8::FunctionCallback callback); |
| /** |
| * Returns a `JsEngine` instance contained in a `v8::Arguments` object. |
| @@ -161,7 +203,7 @@ |
| * instance. |
| * @return `JsEngine` instance from `v8::Arguments`. |
| */ |
| - static JsEnginePtr FromArguments(const v8::Arguments& arguments); |
| + static JsEnginePtr FromArguments(const v8::FunctionCallbackInfo<v8::Value>& arguments); |
| /** |
| * Converts v8 arguments to `JsValue` objects. |
| @@ -169,7 +211,7 @@ |
| * convert. |
| * @return List of arguments converted to `JsValue` objects. |
| */ |
| - JsValueList ConvertArguments(const v8::Arguments& arguments); |
| + JsValueList ConvertArguments(const v8::FunctionCallbackInfo<v8::Value>& arguments); |
| /** |
| * @see `SetFileSystem()`. |
| @@ -212,13 +254,9 @@ |
| void SetLogSystem(LogSystemPtr val); |
| private: |
| - JsEngine(); |
| - |
| FileSystemPtr fileSystem; |
| WebRequestPtr webRequest; |
| LogSystemPtr logSystem; |
| - v8::Isolate* isolate; |
| - V8ValueHolder<v8::Context> context; |
| EventMap eventCallbacks; |
| }; |
| } |