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 |