| Index: include/AdblockPlus/JsEngine.h | 
| diff --git a/include/AdblockPlus/JsEngine.h b/include/AdblockPlus/JsEngine.h | 
| index f8062b657d5312a2204d540b156d5b268e22b259..ea6616e93082d3c8c33fe053ebbd5befd71544a9 100644 | 
| --- a/include/AdblockPlus/JsEngine.h | 
| +++ b/include/AdblockPlus/JsEngine.h | 
| @@ -30,6 +30,7 @@ | 
| #include <AdblockPlus/FileSystem.h> | 
| #include <AdblockPlus/JsValue.h> | 
| #include <AdblockPlus/WebRequest.h> | 
| +#include <AdblockPlus/ITimer.h> | 
|  | 
| namespace v8 | 
| { | 
| @@ -51,6 +52,11 @@ namespace AdblockPlus | 
| typedef std::shared_ptr<JsEngine> JsEnginePtr; | 
|  | 
| /** | 
| +   * A factory to construct DefaultTimer. | 
| +   */ | 
| +  TimerPtr CreateDefaultTimer(); | 
| + | 
| +  /** | 
| * Scope based isolate manager. Creates a new isolate instance on | 
| * constructing and disposes it on destructing. | 
| */ | 
| @@ -103,11 +109,14 @@ namespace AdblockPlus | 
| /** | 
| * Creates a new JavaScript engine instance. | 
| * @param appInfo Information about the app. | 
| +     * @param timer Implementation of timer. | 
| * @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(), const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate())); | 
| +    static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), | 
| +      TimerPtr timer = CreateDefaultTimer(), | 
| +      const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate())); | 
|  | 
| /** | 
| * Registers the callback function for an event. | 
| @@ -195,6 +204,13 @@ namespace AdblockPlus | 
| */ | 
| static JsEnginePtr FromArguments(const v8::Arguments& arguments); | 
|  | 
| +    /* | 
| +     * Private functionality required to implement timers. | 
| +     * @param arguments `v8::Arguments` is the arguments received in C++ | 
| +     * callback associated for global setTimeout method. | 
| +     */ | 
| +    static void ScheduleTimer(const v8::Arguments& arguments); | 
| + | 
| /** | 
| * Converts v8 arguments to `JsValue` objects. | 
| * @param arguments `v8::Arguments` object containing the arguments to | 
| @@ -271,23 +287,16 @@ namespace AdblockPlus | 
| return isolate->Get(); | 
| } | 
|  | 
| -    // Private functionality required to implement timers. | 
| -    struct TimerTaskInfo | 
| -    { | 
| -      ~TimerTaskInfo(); | 
| -      int delay; | 
| -      std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments; | 
| -    }; | 
| -    typedef std::list<TimerTaskInfo> TimerTaskInfos; | 
| +  private: | 
| struct TimerTask | 
| { | 
| -      std::weak_ptr<JsEngine> weakJsEngine; | 
| -      TimerTaskInfos::const_iterator taskInfoIterator; | 
| +      ~TimerTask(); | 
| +      std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments; | 
| }; | 
| -    TimerTask CreateTimerTask(const v8::Arguments& arguments); | 
| -    void CallTimerTask(TimerTaskInfos::const_iterator taskInfoIterator); | 
| -  private: | 
| -    explicit JsEngine(const ScopedV8IsolatePtr& isolate); | 
| +    typedef std::list<TimerTask> TimerTasks; | 
| +    void CallTimerTask(TimerTasks::const_iterator timerTaskIterator); | 
| + | 
| +    explicit JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer); | 
|  | 
| JsValuePtr GetGlobalObject(); | 
|  | 
| @@ -303,7 +312,8 @@ namespace AdblockPlus | 
| std::mutex eventCallbacksMutex; | 
| std::mutex isConnectionAllowedMutex; | 
| IsConnectionAllowedCallback isConnectionAllowed; | 
| -    TimerTaskInfos timerTaskInfos; | 
| +    TimerTasks timerTasks; | 
| +    TimerPtr timer; | 
| }; | 
| } | 
|  | 
|  |