Index: include/AdblockPlus/JsEngine.h |
=================================================================== |
--- a/include/AdblockPlus/JsEngine.h |
+++ b/include/AdblockPlus/JsEngine.h |
@@ -1,11 +1,11 @@ |
/* |
* This file is part of Adblock Plus <https://adblockplus.org/>, |
- * Copyright (C) 2006-2015 Eyeo GmbH |
+ * Copyright (C) 2006-2016 Eyeo GmbH |
* |
* Adblock Plus is free software: you can redistribute it and/or modify |
* it under the terms of the GNU General Public License version 3 as |
* published by the Free Software Foundation. |
* |
* Adblock Plus is distributed in the hope that it will be useful, |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
@@ -24,18 +24,16 @@ |
#include <stdint.h> |
#include <string> |
#include <AdblockPlus/AppInfo.h> |
#include <AdblockPlus/LogSystem.h> |
#include <AdblockPlus/FileSystem.h> |
#include <AdblockPlus/JsValue.h> |
#include <AdblockPlus/WebRequest.h> |
-#include "V8ValueHolder.h" |
- |
namespace v8 |
{ |
class Arguments; |
class Isolate; |
class Value; |
class Context; |
template<class T> class Handle; |
typedef Handle<Value>(*InvocationCallback)(const Arguments &args); |
@@ -46,16 +44,41 @@ namespace AdblockPlus |
class JsEngine; |
/** |
* Shared smart pointer to a `JsEngine` instance. |
*/ |
typedef std::shared_ptr<JsEngine> JsEnginePtr; |
/** |
+ * Scope based isolate manager. Creates a new isolate instance on |
+ * constructing and disposes it on destructing. |
+ */ |
+ class ScopedV8Isolate |
+ { |
+ public: |
+ ScopedV8Isolate(); |
+ ~ScopedV8Isolate(); |
+ v8::Isolate* Get() |
+ { |
+ return isolate; |
+ } |
+ private: |
+ ScopedV8Isolate(const ScopedV8Isolate&); |
+ ScopedV8Isolate& operator=(const ScopedV8Isolate&); |
+ |
+ v8::Isolate* isolate; |
+ }; |
+ |
+ /** |
+ * Shared smart pointer to ScopedV8Isolate instance; |
+ */ |
+ typedef std::shared_ptr<ScopedV8Isolate> ScopedV8IsolatePtr; |
+ |
+ /** |
* JavaScript engine used by `FilterEngine`, wraps v8. |
*/ |
class JsEngine : public std::enable_shared_from_this<JsEngine> |
{ |
friend class JsValue; |
friend class JsContext; |
public: |
@@ -67,19 +90,21 @@ namespace AdblockPlus |
/** |
* Maps events to callback functions. |
*/ |
typedef std::map<std::string, EventCallback> EventMap; |
/** |
* Creates a new JavaScript engine instance. |
* @param appInfo Information about the app. |
+ * @param isolate v8::Isolate wrapper. This parameter should be considered |
+ * as a temporary hack for tests, it will go away. Issue #3593. |
* @return New `JsEngine` instance. |
*/ |
- static JsEnginePtr New(const AppInfo& appInfo = AppInfo()); |
+ static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate())); |
/** |
* Registers the callback function for an event. |
* @param eventName Event name. Note that this can be any string - it's a |
* general purpose event handling mechanism. |
* @param callback Event callback function. |
*/ |
void SetEventCallback(const std::string& eventName, EventCallback callback); |
@@ -212,22 +237,33 @@ namespace AdblockPlus |
/** |
* Sets a global property that can be accessed by all the scripts. |
* @param name Name of the property to set. |
* @param value Value of the property to set. |
*/ |
void SetGlobalProperty(const std::string& name, AdblockPlus::JsValuePtr value); |
+ /** |
+ * Returns a pointer to associated v8::Isolate. |
+ */ |
+ v8::Isolate* GetIsolate() |
+ { |
+ return isolate->Get(); |
+ } |
+ |
private: |
- JsEngine(); |
+ explicit JsEngine(const ScopedV8IsolatePtr& isolate); |
+ |
+ /// Isolate must be disposed only after disposing of all objects which are |
+ /// using it. |
+ ScopedV8IsolatePtr isolate; |
FileSystemPtr fileSystem; |
WebRequestPtr webRequest; |
LogSystemPtr logSystem; |
- v8::Isolate* isolate; |
- V8ValueHolder<v8::Context> context; |
+ std::unique_ptr<v8::Persistent<v8::Context>> context; |
EventMap eventCallbacks; |
JsValuePtr globalJsObject; |
}; |
} |
#endif |