| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-2017 eyeo GmbH | 3  * Copyright (C) 2006-2017 eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 23 #include <list> | 23 #include <list> | 
| 24 #include <stdexcept> | 24 #include <stdexcept> | 
| 25 #include <stdint.h> | 25 #include <stdint.h> | 
| 26 #include <string> | 26 #include <string> | 
| 27 #include <mutex> | 27 #include <mutex> | 
| 28 #include <AdblockPlus/AppInfo.h> | 28 #include <AdblockPlus/AppInfo.h> | 
| 29 #include <AdblockPlus/LogSystem.h> | 29 #include <AdblockPlus/LogSystem.h> | 
| 30 #include <AdblockPlus/FileSystem.h> | 30 #include <AdblockPlus/FileSystem.h> | 
| 31 #include <AdblockPlus/JsValue.h> | 31 #include <AdblockPlus/JsValue.h> | 
| 32 #include <AdblockPlus/WebRequest.h> | 32 #include <AdblockPlus/WebRequest.h> | 
|  | 33 #include <AdblockPlus/ITimer.h> | 
| 33 | 34 | 
| 34 namespace v8 | 35 namespace v8 | 
| 35 { | 36 { | 
| 36   class Arguments; | 37   class Arguments; | 
| 37   class Isolate; | 38   class Isolate; | 
| 38   class Value; | 39   class Value; | 
| 39   class Context; | 40   class Context; | 
| 40   template<class T> class Handle; | 41   template<class T> class Handle; | 
| 41   typedef Handle<Value>(*InvocationCallback)(const Arguments &args); | 42   typedef Handle<Value>(*InvocationCallback)(const Arguments &args); | 
| 42 } | 43 } | 
| 43 | 44 | 
| 44 namespace AdblockPlus | 45 namespace AdblockPlus | 
| 45 { | 46 { | 
| 46   class JsEngine; | 47   class JsEngine; | 
| 47 | 48 | 
| 48   /** | 49   /** | 
| 49    * Shared smart pointer to a `JsEngine` instance. | 50    * Shared smart pointer to a `JsEngine` instance. | 
| 50    */ | 51    */ | 
| 51   typedef std::shared_ptr<JsEngine> JsEnginePtr; | 52   typedef std::shared_ptr<JsEngine> JsEnginePtr; | 
| 52 | 53 | 
| 53   /** | 54   /** | 
|  | 55    * A factory to construct DefaultTimer. | 
|  | 56    */ | 
|  | 57   TimerPtr CreateDefaultTimer(); | 
|  | 58 | 
|  | 59   /** | 
| 54    * Scope based isolate manager. Creates a new isolate instance on | 60    * Scope based isolate manager. Creates a new isolate instance on | 
| 55    * constructing and disposes it on destructing. | 61    * constructing and disposes it on destructing. | 
| 56    */ | 62    */ | 
| 57   class ScopedV8Isolate | 63   class ScopedV8Isolate | 
| 58   { | 64   { | 
| 59   public: | 65   public: | 
| 60     ScopedV8Isolate(); | 66     ScopedV8Isolate(); | 
| 61     ~ScopedV8Isolate(); | 67     ~ScopedV8Isolate(); | 
| 62     v8::Isolate* Get() | 68     v8::Isolate* Get() | 
| 63     { | 69     { | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 96     typedef std::function<bool()> IsConnectionAllowedCallback; | 102     typedef std::function<bool()> IsConnectionAllowedCallback; | 
| 97 | 103 | 
| 98     /** | 104     /** | 
| 99      * Maps events to callback functions. | 105      * Maps events to callback functions. | 
| 100      */ | 106      */ | 
| 101     typedef std::map<std::string, EventCallback> EventMap; | 107     typedef std::map<std::string, EventCallback> EventMap; | 
| 102 | 108 | 
| 103     /** | 109     /** | 
| 104      * Creates a new JavaScript engine instance. | 110      * Creates a new JavaScript engine instance. | 
| 105      * @param appInfo Information about the app. | 111      * @param appInfo Information about the app. | 
|  | 112      * @param timer Implementation of timer. | 
| 106      * @param isolate v8::Isolate wrapper. This parameter should be considered | 113      * @param isolate v8::Isolate wrapper. This parameter should be considered | 
| 107      *        as a temporary hack for tests, it will go away. Issue #3593. | 114      *        as a temporary hack for tests, it will go away. Issue #3593. | 
| 108      * @return New `JsEngine` instance. | 115      * @return New `JsEngine` instance. | 
| 109      */ | 116      */ | 
| 110     static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), const ScopedV8Iso
     latePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate())); | 117     static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), | 
|  | 118       TimerPtr timer = CreateDefaultTimer(), | 
|  | 119       const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate
     ())); | 
| 111 | 120 | 
| 112     /** | 121     /** | 
| 113      * Registers the callback function for an event. | 122      * Registers the callback function for an event. | 
| 114      * @param eventName Event name. Note that this can be any string - it's a | 123      * @param eventName Event name. Note that this can be any string - it's a | 
| 115      *        general purpose event handling mechanism. | 124      *        general purpose event handling mechanism. | 
| 116      * @param callback Event callback function. | 125      * @param callback Event callback function. | 
| 117      */ | 126      */ | 
| 118     void SetEventCallback(const std::string& eventName, EventCallback callback); | 127     void SetEventCallback(const std::string& eventName, EventCallback callback); | 
| 119 | 128 | 
| 120     /** | 129     /** | 
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 188     /** | 197     /** | 
| 189      * Returns a `JsEngine` instance contained in a `v8::Arguments` object. | 198      * Returns a `JsEngine` instance contained in a `v8::Arguments` object. | 
| 190      * Use this in callbacks created via `NewCallback()` to retrieve the current | 199      * Use this in callbacks created via `NewCallback()` to retrieve the current | 
| 191      * `JsEngine`. | 200      * `JsEngine`. | 
| 192      * @param arguments `v8::Arguments` object containing the `JsEngine` | 201      * @param arguments `v8::Arguments` object containing the `JsEngine` | 
| 193      *        instance. | 202      *        instance. | 
| 194      * @return `JsEngine` instance from `v8::Arguments`. | 203      * @return `JsEngine` instance from `v8::Arguments`. | 
| 195      */ | 204      */ | 
| 196     static JsEnginePtr FromArguments(const v8::Arguments& arguments); | 205     static JsEnginePtr FromArguments(const v8::Arguments& arguments); | 
| 197 | 206 | 
|  | 207     /* | 
|  | 208      * Private functionality required to implement timers. | 
|  | 209      * @param arguments `v8::Arguments` is the arguments received in C++ | 
|  | 210      * callback associated for global setTimeout method. | 
|  | 211      */ | 
|  | 212     static void ScheduleTimer(const v8::Arguments& arguments); | 
|  | 213 | 
| 198     /** | 214     /** | 
| 199      * Converts v8 arguments to `JsValue` objects. | 215      * Converts v8 arguments to `JsValue` objects. | 
| 200      * @param arguments `v8::Arguments` object containing the arguments to | 216      * @param arguments `v8::Arguments` object containing the arguments to | 
| 201      *        convert. | 217      *        convert. | 
| 202      * @return List of arguments converted to `JsValue` objects. | 218      * @return List of arguments converted to `JsValue` objects. | 
| 203      */ | 219      */ | 
| 204     JsValueList ConvertArguments(const v8::Arguments& arguments); | 220     JsValueList ConvertArguments(const v8::Arguments& arguments); | 
| 205 | 221 | 
| 206     /** | 222     /** | 
| 207      * @see `SetFileSystem()`. | 223      * @see `SetFileSystem()`. | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 264     void SetGlobalProperty(const std::string& name, AdblockPlus::JsValuePtr valu
     e); | 280     void SetGlobalProperty(const std::string& name, AdblockPlus::JsValuePtr valu
     e); | 
| 265 | 281 | 
| 266     /** | 282     /** | 
| 267      * Returns a pointer to associated v8::Isolate. | 283      * Returns a pointer to associated v8::Isolate. | 
| 268      */ | 284      */ | 
| 269     v8::Isolate* GetIsolate() | 285     v8::Isolate* GetIsolate() | 
| 270     { | 286     { | 
| 271       return isolate->Get(); | 287       return isolate->Get(); | 
| 272     } | 288     } | 
| 273 | 289 | 
| 274     // Private functionality required to implement timers. | 290   private: | 
| 275     struct TimerTaskInfo | 291     struct TimerTask | 
| 276     { | 292     { | 
| 277       ~TimerTaskInfo(); | 293       ~TimerTask(); | 
| 278       int delay; |  | 
| 279       std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments; | 294       std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments; | 
| 280     }; | 295     }; | 
| 281     typedef std::list<TimerTaskInfo> TimerTaskInfos; | 296     typedef std::list<TimerTask> TimerTasks; | 
| 282     struct TimerTask | 297     void CallTimerTask(TimerTasks::const_iterator timerTaskIterator); | 
| 283     { | 298 | 
| 284       std::weak_ptr<JsEngine> weakJsEngine; | 299     explicit JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer); | 
| 285       TimerTaskInfos::const_iterator taskInfoIterator; |  | 
| 286     }; |  | 
| 287     TimerTask CreateTimerTask(const v8::Arguments& arguments); |  | 
| 288     void CallTimerTask(TimerTaskInfos::const_iterator taskInfoIterator); |  | 
| 289   private: |  | 
| 290     explicit JsEngine(const ScopedV8IsolatePtr& isolate); |  | 
| 291 | 300 | 
| 292     JsValuePtr GetGlobalObject(); | 301     JsValuePtr GetGlobalObject(); | 
| 293 | 302 | 
| 294     /// Isolate must be disposed only after disposing of all objects which are | 303     /// Isolate must be disposed only after disposing of all objects which are | 
| 295     /// using it. | 304     /// using it. | 
| 296     ScopedV8IsolatePtr isolate; | 305     ScopedV8IsolatePtr isolate; | 
| 297 | 306 | 
| 298     FileSystemPtr fileSystem; | 307     FileSystemPtr fileSystem; | 
| 299     WebRequestPtr webRequest; | 308     WebRequestPtr webRequest; | 
| 300     LogSystemPtr logSystem; | 309     LogSystemPtr logSystem; | 
| 301     std::unique_ptr<v8::Persistent<v8::Context>> context; | 310     std::unique_ptr<v8::Persistent<v8::Context>> context; | 
| 302     EventMap eventCallbacks; | 311     EventMap eventCallbacks; | 
| 303     std::mutex eventCallbacksMutex; | 312     std::mutex eventCallbacksMutex; | 
| 304     std::mutex isConnectionAllowedMutex; | 313     std::mutex isConnectionAllowedMutex; | 
| 305     IsConnectionAllowedCallback isConnectionAllowed; | 314     IsConnectionAllowedCallback isConnectionAllowed; | 
| 306     TimerTaskInfos timerTaskInfos; | 315     TimerTasks timerTasks; | 
|  | 316     TimerPtr timer; | 
| 307   }; | 317   }; | 
| 308 } | 318 } | 
| 309 | 319 | 
| 310 #endif | 320 #endif | 
| OLD | NEW | 
|---|