| Index: include/AdblockPlus/JsEngine.h | 
| diff --git a/include/AdblockPlus/JsEngine.h b/include/AdblockPlus/JsEngine.h | 
| index f7470ab84367b00e298c9038d92b21837fb08202..d45e731d2eb89106607b7498658ae0476bb1ab35 100644 | 
| --- a/include/AdblockPlus/JsEngine.h | 
| +++ b/include/AdblockPlus/JsEngine.h | 
| @@ -1,6 +1,6 @@ | 
| /* | 
| * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| - * Copyright (C) 2006-2017 eyeo GmbH | 
| + * Copyright (C) 2006-present 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 | 
| @@ -27,10 +27,11 @@ | 
| #include <mutex> | 
| #include <AdblockPlus/AppInfo.h> | 
| #include <AdblockPlus/LogSystem.h> | 
| -#include <AdblockPlus/FileSystem.h> | 
| +#include <AdblockPlus/IFileSystem.h> | 
| #include <AdblockPlus/JsValue.h> | 
| -#include <AdblockPlus/WebRequest.h> | 
| +#include <AdblockPlus/IWebRequest.h> | 
| #include <AdblockPlus/ITimer.h> | 
| +#include <AdblockPlus/Scheduler.h> | 
|  | 
| namespace v8 | 
| { | 
| @@ -44,6 +45,7 @@ namespace v8 | 
| namespace AdblockPlus | 
| { | 
| class JsEngine; | 
| +  class Platform; | 
|  | 
| /** | 
| * Shared smart pointer to a `JsEngine` instance. | 
| @@ -51,38 +53,18 @@ namespace AdblockPlus | 
| typedef std::shared_ptr<JsEngine> JsEnginePtr; | 
|  | 
| /** | 
| -   * A factory to construct DefaultTimer. | 
| +   * Provides with isolate. The main aim of this iterface is to delegate a | 
| +   * proper initialization and deinitialization of v8::Isolate to an embedder. | 
| */ | 
| -  TimerPtr CreateDefaultTimer(); | 
| - | 
| -  /** | 
| -   * A factory to construct DefaultFileSystem. | 
| -   */ | 
| -  FileSystemPtr CreateDefaultFileSystem(); | 
| - | 
| -  /** | 
| -   * A factory to construct DefaultWebRequest. | 
| -   */ | 
| -  WebRequestPtr CreateDefaultWebRequest(); | 
| - | 
| -  /** | 
| -   * Scope based isolate manager. Creates a new isolate instance on | 
| -   * constructing and disposes it on destructing. | 
| -   */ | 
| -  class ScopedV8Isolate | 
| +  struct IV8IsolateProvider | 
| { | 
| -  public: | 
| -    ScopedV8Isolate(); | 
| -    ~ScopedV8Isolate(); | 
| -    v8::Isolate* Get() | 
| -    { | 
| -      return isolate; | 
| -    } | 
| -  private: | 
| -    ScopedV8Isolate(const ScopedV8Isolate&); | 
| -    ScopedV8Isolate& operator=(const ScopedV8Isolate&); | 
| +    virtual ~IV8IsolateProvider() {} | 
|  | 
| -    v8::Isolate* isolate; | 
| +    /** | 
| +     * Returns v8::Isolate. All subsequent calls of this method should return | 
| +     * the same pointer to v8::Isolate as the first call. | 
| +     */ | 
| +    virtual v8::Isolate* Get() = 0; | 
| }; | 
|  | 
| /** | 
| @@ -112,7 +94,6 @@ namespace AdblockPlus | 
|  | 
| /** | 
| * An opaque structure representing ID of stored JsValueList. | 
| -     * | 
| */ | 
| class JsWeakValuesID | 
| { | 
| @@ -122,17 +103,15 @@ namespace AdblockPlus | 
|  | 
| /** | 
| * Creates a new JavaScript engine instance. | 
| +     * | 
| * @param appInfo Information about the app. | 
| -     * @param timer Implementation of timer. | 
| -     * @param fileSystem Implementation of filesystem. | 
| -     * @param webRequest Implementation of web request. | 
| +     * @param platform AdblockPlus platform providing with necessary | 
| +     *        dependencies. | 
| +     * @param isolate A provider of v8::Isolate, if the value is nullptr then | 
| +     *        a default implementation is used. | 
| * @return New `JsEngine` instance. | 
| */ | 
| -    static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), | 
| -      TimerPtr timer = CreateDefaultTimer(), | 
| -      FileSystemPtr fileSystem = CreateDefaultFileSystem(), | 
| -      WebRequestPtr webRequest = CreateDefaultWebRequest()); | 
| - | 
| +    static JsEnginePtr New(const AppInfo& appInfo, Platform& platform, std::unique_ptr<IV8IsolateProvider> isolate = nullptr); | 
| /** | 
| * Registers the callback function for an event. | 
| * @param eventName Event name. Note that this can be any string - it's a | 
| @@ -262,43 +241,6 @@ namespace AdblockPlus | 
| JsValueList ConvertArguments(const v8::FunctionCallbackInfo<v8::Value>& arguments); | 
|  | 
| /** | 
| -     * Private functionality. | 
| -     * @return The asynchronous IFileSystem implementation. | 
| -     */ | 
| -    FileSystemPtr GetAsyncFileSystem() const; | 
| - | 
| -    /** | 
| -     * Sets the synchronous `FileSystem` implementation used for all | 
| -     * file I/O. Setting this is optional, the engine will use the | 
| -     * implementation created by `CreateDefaultFileSystem()` by | 
| -     * default, which might be sufficient. | 
| -     * @param The `FileSystem` instance to use. | 
| -     */ | 
| -    void SetFileSystem(const FileSystemSyncPtr& val); | 
| - | 
| -    /** | 
| -     * Sets the `WebRequest` implementation used for XMLHttpRequests. | 
| -     * Setting this is optional, the engine will use a `DefaultWebRequest` | 
| -     * instance by default, which might be sufficient. | 
| -     * @param The `WebRequest` instance to use. | 
| -     */ | 
| -    void SetWebRequest(const WebRequestSharedPtr& val); | 
| - | 
| -    /** | 
| -     * @see `SetLogSystem()`. | 
| -     */ | 
| -    LogSystemPtr GetLogSystem() const; | 
| - | 
| -    /** | 
| -     * Sets the `LogSystem` implementation used for logging (e.g. to handle | 
| -     * `console.log()` calls from JavaScript). | 
| -     * Setting this is optional, the engine will use a `DefaultLogSystem` | 
| -     * instance by default, which might be sufficient. | 
| -     * @param The `LogSystem` instance to use. | 
| -     */ | 
| -    void SetLogSystem(const LogSystemPtr& val); | 
| - | 
| -    /** | 
| * 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. | 
| @@ -310,7 +252,7 @@ namespace AdblockPlus | 
| */ | 
| v8::Isolate* GetIsolate() | 
| { | 
| -      return isolate.Get(); | 
| +      return isolate->Get(); | 
| } | 
|  | 
| /** | 
| @@ -318,27 +260,31 @@ namespace AdblockPlus | 
| * garbage collection. | 
| */ | 
| void NotifyLowMemory(); | 
| + | 
| +    /** | 
| +     * Private functionality. | 
| +     */ | 
| +    Platform& GetPlatform() | 
| +    { | 
| +      return platform; | 
| +    } | 
| private: | 
| void CallTimerTask(const JsWeakValuesID& timerParamsID); | 
|  | 
| -    explicit JsEngine(TimerPtr timer, FileSystemPtr fileSystem, WebRequestPtr webRequest); | 
| +    explicit JsEngine(Platform& platform, std::unique_ptr<IV8IsolateProvider> isolate); | 
|  | 
| JsValue GetGlobalObject(); | 
|  | 
| +    Platform& platform; | 
| /// Isolate must be disposed only after disposing of all objects which are | 
| /// using it. | 
| -    ScopedV8Isolate isolate; | 
| +    std::unique_ptr<IV8IsolateProvider> isolate; | 
|  | 
| -    FileSystemPtr fileSystem; | 
| -    LogSystemPtr logSystem; | 
| std::unique_ptr<v8::Global<v8::Context>> context; | 
| EventMap eventCallbacks; | 
| std::mutex eventCallbacksMutex; | 
| JsWeakValuesLists jsWeakValuesLists; | 
| std::mutex jsWeakValuesListsMutex; | 
| -    TimerPtr timer; | 
| -    WebRequestPtr webRequest; | 
| -    WebRequestSharedPtr webRequestLegacy; | 
| }; | 
| } | 
|  | 
|  |