| Index: include/AdblockPlus/JsEngine.h |
| diff --git a/include/AdblockPlus/JsEngine.h b/include/AdblockPlus/JsEngine.h |
| index 10e27ed4a2b94a0a4e03f6487642c716c6b0b887..11383848a87beaa282564da8905a3cb5779e3fc0 100644 |
| --- a/include/AdblockPlus/JsEngine.h |
| +++ b/include/AdblockPlus/JsEngine.h |
| @@ -89,6 +89,12 @@ namespace AdblockPlus |
| friend class JsValue; |
| friend class JsContext; |
| + struct JsWeakValuesList |
| + { |
| + ~JsWeakValuesList(); |
| + std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> values; |
| + }; |
| + typedef std::list<JsWeakValuesList> JsWeakValuesLists; |
| public: |
| /** |
| * Event callback function. |
| @@ -107,6 +113,16 @@ namespace AdblockPlus |
| typedef std::map<std::string, EventCallback> EventMap; |
| /** |
| + * An opaque structure representing ID of stored JsValueList. |
| + * |
| + */ |
| + class JsWeakValuesID |
| + { |
| + friend class JsEngine; |
| + JsWeakValuesLists::const_iterator iterator; |
| + }; |
| + |
| + /** |
| * Creates a new JavaScript engine instance. |
| * @param appInfo Information about the app. |
| * @param timer Implementation of timer. |
| @@ -204,6 +220,25 @@ namespace AdblockPlus |
| */ |
| static JsEnginePtr FromArguments(const v8::Arguments& arguments); |
| + /** |
| + * Stores `JsValue`s in a way they don't keep a strong reference to |
| + * `JsEngine` and which are destroyed when `JsEngine` is destroyed. These |
| + * methods should be used when one needs to carry a JsValue in a callback |
| + * directly or indirectly passed to `JsEngine`. |
| + * The method is thread-safe. |
| + * @param `JsValueList` to store. |
| + * @return `JsWeakValuesID` of stored values which allows to restore them |
| + * later. |
| + */ |
| + JsWeakValuesID StoreJsValues(const JsValueList& values); |
| + /** |
| + * Extracts and removes from `JsEngine` earlier stored `JsValue`s. |
| + * The method is thread-safe. |
| + * @param id `JsWeakValuesID` of values. |
| + * @return `JsValueList` of stored values. |
| + */ |
| + JsValueList TakeJsValues(const JsWeakValuesID& id); |
| + |
| /* |
| * Private functionality required to implement timers. |
| * @param arguments `v8::Arguments` is the arguments received in C++ |
| @@ -288,13 +323,7 @@ namespace AdblockPlus |
| } |
| private: |
| - struct TimerTask |
| - { |
| - ~TimerTask(); |
| - std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments; |
| - }; |
| - typedef std::list<TimerTask> TimerTasks; |
| - void CallTimerTask(const TimerTasks::const_iterator& timerTaskIterator); |
| + void CallTimerTask(const JsWeakValuesID& timerParamsID); |
| explicit JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer); |
| @@ -312,7 +341,8 @@ namespace AdblockPlus |
| std::mutex eventCallbacksMutex; |
| mutable std::mutex isConnectionAllowedMutex; |
| IsConnectionAllowedCallback isConnectionAllowed; |
| - TimerTasks timerTasks; |
| + JsWeakValuesLists jsWeakValuesLists; |
| + std::mutex jsWeakValuesListsMutex; |
| TimerPtr timer; |
| }; |
| } |