Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: include/AdblockPlus/JsEngine.h

Issue 29429555: Noissue - updated to libadblockplus revision dca8df9af1a7 (Closed)
Patch Set: Created May 4, 2017, 5:08 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/AdblockPlus/FilterEngine.h ('k') | include/AdblockPlus/JsValue.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 typedef std::shared_ptr<ScopedV8Isolate> ScopedV8IsolatePtr; 82 typedef std::shared_ptr<ScopedV8Isolate> ScopedV8IsolatePtr;
83 83
84 /** 84 /**
85 * JavaScript engine used by `FilterEngine`, wraps v8. 85 * JavaScript engine used by `FilterEngine`, wraps v8.
86 */ 86 */
87 class JsEngine : public std::enable_shared_from_this<JsEngine> 87 class JsEngine : public std::enable_shared_from_this<JsEngine>
88 { 88 {
89 friend class JsValue; 89 friend class JsValue;
90 friend class JsContext; 90 friend class JsContext;
91 91
92 struct JsWeakValuesList
93 {
94 ~JsWeakValuesList();
95 std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> values;
96 };
97 typedef std::list<JsWeakValuesList> JsWeakValuesLists;
92 public: 98 public:
93 /** 99 /**
94 * Event callback function. 100 * Event callback function.
95 */ 101 */
96 typedef std::function<void(JsValueList& params)> EventCallback; 102 typedef std::function<void(JsValueList&& params)> EventCallback;
97
98 /**
99 * Callback function returning false when current connection is not allowed
100 * e.g. because it is a metered connection.
101 */
102 typedef std::function<bool()> IsConnectionAllowedCallback;
103 103
104 /** 104 /**
105 * Maps events to callback functions. 105 * Maps events to callback functions.
106 */ 106 */
107 typedef std::map<std::string, EventCallback> EventMap; 107 typedef std::map<std::string, EventCallback> EventMap;
108 108
109 /** 109 /**
110 * An opaque structure representing ID of stored JsValueList.
111 *
112 */
113 class JsWeakValuesID
114 {
115 friend class JsEngine;
116 JsWeakValuesLists::const_iterator iterator;
117 };
118
119 /**
110 * Creates a new JavaScript engine instance. 120 * Creates a new JavaScript engine instance.
111 * @param appInfo Information about the app. 121 * @param appInfo Information about the app.
112 * @param timer Implementation of timer. 122 * @param timer Implementation of timer.
113 * @param isolate v8::Isolate wrapper. This parameter should be considered 123 * @param isolate v8::Isolate wrapper. This parameter should be considered
114 * as a temporary hack for tests, it will go away. Issue #3593. 124 * as a temporary hack for tests, it will go away. Issue #3593.
115 * @return New `JsEngine` instance. 125 * @return New `JsEngine` instance.
116 */ 126 */
117 static JsEnginePtr New(const AppInfo& appInfo = AppInfo(), 127 static JsEnginePtr New(const AppInfo& appInfo = AppInfo(),
118 TimerPtr timer = CreateDefaultTimer(), 128 TimerPtr timer = CreateDefaultTimer(),
119 const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate ())); 129 const ScopedV8IsolatePtr& isolate = ScopedV8IsolatePtr(new ScopedV8Isolate ()));
120 130
121 /** 131 /**
122 * Registers the callback function for an event. 132 * Registers the callback function for an event.
123 * @param eventName Event name. Note that this can be any string - it's a 133 * @param eventName Event name. Note that this can be any string - it's a
124 * general purpose event handling mechanism. 134 * general purpose event handling mechanism.
125 * @param callback Event callback function. 135 * @param callback Event callback function.
126 */ 136 */
127 void SetEventCallback(const std::string& eventName, EventCallback callback); 137 void SetEventCallback(const std::string& eventName, const EventCallback& cal lback);
128 138
129 /** 139 /**
130 * Removes the callback function for an event. 140 * Removes the callback function for an event.
131 * @param eventName Event name. 141 * @param eventName Event name.
132 */ 142 */
133 void RemoveEventCallback(const std::string& eventName); 143 void RemoveEventCallback(const std::string& eventName);
134 144
135 /** 145 /**
136 * Triggers an event. 146 * Triggers an event.
137 * @param eventName Event name. 147 * @param eventName Event name.
138 * @param params Event parameters. 148 * @param params Event parameters.
139 */ 149 */
140 void TriggerEvent(const std::string& eventName, JsValueList& params); 150 void TriggerEvent(const std::string& eventName, JsValueList&& params);
141 151
142 /** 152 /**
143 * Evaluates a JavaScript expression. 153 * Evaluates a JavaScript expression.
144 * @param source JavaScript expression to evaluate. 154 * @param source JavaScript expression to evaluate.
145 * @param filename Optional file name for the expression, used in error 155 * @param filename Optional file name for the expression, used in error
146 * messages. 156 * messages.
147 * @return Result of the evaluated expression. 157 * @return Result of the evaluated expression.
148 */ 158 */
149 JsValuePtr Evaluate(const std::string& source, 159 JsValue Evaluate(const std::string& source,
150 const std::string& filename = ""); 160 const std::string& filename = "");
151 161
152 /** 162 /**
153 * Initiates a garbage collection. 163 * Initiates a garbage collection.
154 */ 164 */
155 void Gc(); 165 void Gc();
156 166
157 //@{ 167 //@{
158 /** 168 /**
159 * Creates a new JavaScript value. 169 * Creates a new JavaScript value.
160 * @param val Value to convert. 170 * @param val Value to convert.
161 * @return New `JsValue` instance. 171 * @return New `JsValue` instance.
162 */ 172 */
163 JsValuePtr NewValue(const std::string& val); 173 JsValue NewValue(const std::string& val);
164 JsValuePtr NewValue(int64_t val); 174 JsValue NewValue(int64_t val);
165 JsValuePtr NewValue(bool val); 175 JsValue NewValue(bool val);
166 inline JsValuePtr NewValue(const char* val) 176 inline JsValue NewValue(const char* val)
167 { 177 {
168 return NewValue(std::string(val)); 178 return NewValue(std::string(val));
169 } 179 }
170 inline JsValuePtr NewValue(int val) 180 inline JsValue NewValue(int val)
171 { 181 {
172 return NewValue(static_cast<int64_t>(val)); 182 return NewValue(static_cast<int64_t>(val));
173 } 183 }
174 #ifdef __APPLE__ 184 #ifdef __APPLE__
175 inline JsValuePtr NewValue(long val) 185 inline JsValue NewValue(long val)
176 { 186 {
177 return NewValue(static_cast<int64_t>(val)); 187 return NewValue(static_cast<int64_t>(val));
178 } 188 }
179 #endif 189 #endif
180 //@} 190 //@}
181 191
182 /** 192 /**
183 * Creates a new JavaScript object. 193 * Creates a new JavaScript object.
184 * @return New `JsValue` instance. 194 * @return New `JsValue` instance.
185 */ 195 */
186 JsValuePtr NewObject(); 196 JsValue NewObject();
187 197
188 /** 198 /**
189 * Creates a JavaScript function that invokes a C++ callback. 199 * Creates a JavaScript function that invokes a C++ callback.
190 * @param callback C++ callback to invoke. The callback receives a 200 * @param callback C++ callback to invoke. The callback receives a
191 * `v8::Arguments` object and can use `FromArguments()` to retrieve 201 * `v8::Arguments` object and can use `FromArguments()` to retrieve
192 * the current `JsEngine`. 202 * the current `JsEngine`.
193 * @return New `JsValue` instance. 203 * @return New `JsValue` instance.
194 */ 204 */
195 JsValuePtr NewCallback(v8::InvocationCallback callback); 205 JsValue NewCallback(const v8::InvocationCallback& callback);
196 206
197 /** 207 /**
198 * Returns a `JsEngine` instance contained in a `v8::Arguments` object. 208 * Returns a `JsEngine` instance contained in a `v8::Arguments` object.
199 * Use this in callbacks created via `NewCallback()` to retrieve the current 209 * Use this in callbacks created via `NewCallback()` to retrieve the current
200 * `JsEngine`. 210 * `JsEngine`.
201 * @param arguments `v8::Arguments` object containing the `JsEngine` 211 * @param arguments `v8::Arguments` object containing the `JsEngine`
202 * instance. 212 * instance.
203 * @return `JsEngine` instance from `v8::Arguments`. 213 * @return `JsEngine` instance from `v8::Arguments`.
204 */ 214 */
205 static JsEnginePtr FromArguments(const v8::Arguments& arguments); 215 static JsEnginePtr FromArguments(const v8::Arguments& arguments);
206 216
217 /**
218 * Stores `JsValue`s in a way they don't keep a strong reference to
219 * `JsEngine` and which are destroyed when `JsEngine` is destroyed. These
220 * methods should be used when one needs to carry a JsValue in a callback
221 * directly or indirectly passed to `JsEngine`.
222 * The method is thread-safe.
223 * @param `JsValueList` to store.
224 * @return `JsWeakValuesID` of stored values which allows to restore them
225 * later.
226 */
227 JsWeakValuesID StoreJsValues(const JsValueList& values);
228
229 /**
230 * Extracts and removes from `JsEngine` earlier stored `JsValue`s.
231 * The method is thread-safe.
232 * @param id `JsWeakValuesID` of values.
233 * @return `JsValueList` of stored values.
234 */
235 JsValueList TakeJsValues(const JsWeakValuesID& id);
236
207 /* 237 /*
208 * Private functionality required to implement timers. 238 * Private functionality required to implement timers.
209 * @param arguments `v8::Arguments` is the arguments received in C++ 239 * @param arguments `v8::Arguments` is the arguments received in C++
210 * callback associated for global setTimeout method. 240 * callback associated for global setTimeout method.
211 */ 241 */
212 static void ScheduleTimer(const v8::Arguments& arguments); 242 static void ScheduleTimer(const v8::Arguments& arguments);
213 243
214 /** 244 /**
215 * Converts v8 arguments to `JsValue` objects. 245 * Converts v8 arguments to `JsValue` objects.
216 * @param arguments `v8::Arguments` object containing the arguments to 246 * @param arguments `v8::Arguments` object containing the arguments to
217 * convert. 247 * convert.
218 * @return List of arguments converted to `JsValue` objects. 248 * @return List of arguments converted to `const JsValue` objects.
219 */ 249 */
220 JsValueList ConvertArguments(const v8::Arguments& arguments); 250 JsValueList ConvertArguments(const v8::Arguments& arguments);
221 251
222 /** 252 /**
223 * @see `SetFileSystem()`. 253 * @see `SetFileSystem()`.
224 */ 254 */
225 FileSystemPtr GetFileSystem(); 255 FileSystemPtr GetFileSystem() const;
226 256
227 /** 257 /**
228 * Sets the `FileSystem` implementation used for all file I/O. 258 * Sets the `FileSystem` implementation used for all file I/O.
229 * Setting this is optional, the engine will use a `DefaultFileSystem` 259 * Setting this is optional, the engine will use a `DefaultFileSystem`
230 * instance by default, which might be sufficient. 260 * instance by default, which might be sufficient.
231 * @param The `FileSystem` instance to use. 261 * @param The `FileSystem` instance to use.
232 */ 262 */
233 void SetFileSystem(FileSystemPtr val); 263 void SetFileSystem(const FileSystemPtr& val);
234 264
235 /** 265 /**
236 * @see `SetWebRequest()`. 266 * @see `SetWebRequest()`.
237 */ 267 */
238 WebRequestPtr GetWebRequest(); 268 WebRequestPtr GetWebRequest() const;
239 269
240 /** 270 /**
241 * Sets the `WebRequest` implementation used for XMLHttpRequests. 271 * Sets the `WebRequest` implementation used for XMLHttpRequests.
242 * Setting this is optional, the engine will use a `DefaultWebRequest` 272 * Setting this is optional, the engine will use a `DefaultWebRequest`
243 * instance by default, which might be sufficient. 273 * instance by default, which might be sufficient.
244 * @param The `WebRequest` instance to use. 274 * @param The `WebRequest` instance to use.
245 */ 275 */
246 void SetWebRequest(WebRequestPtr val); 276 void SetWebRequest(const WebRequestPtr& val);
247
248 /**
249 * Registers the callback function to check whether current connection is
250 * allowed for network requests.
251 * @param callback callback function.
252 */
253 void SetIsConnectionAllowedCallback(const IsConnectionAllowedCallback& callb ack);
254
255 /**
256 * Checks whether current connection is allowed. If
257 * IsConnectionAllowedCallback is not set then then it returns true.
258 */
259 bool IsConnectionAllowed();
260 277
261 /** 278 /**
262 * @see `SetLogSystem()`. 279 * @see `SetLogSystem()`.
263 */ 280 */
264 LogSystemPtr GetLogSystem(); 281 LogSystemPtr GetLogSystem() const;
265 282
266 /** 283 /**
267 * Sets the `LogSystem` implementation used for logging (e.g. to handle 284 * Sets the `LogSystem` implementation used for logging (e.g. to handle
268 * `console.log()` calls from JavaScript). 285 * `console.log()` calls from JavaScript).
269 * Setting this is optional, the engine will use a `DefaultLogSystem` 286 * Setting this is optional, the engine will use a `DefaultLogSystem`
270 * instance by default, which might be sufficient. 287 * instance by default, which might be sufficient.
271 * @param The `LogSystem` instance to use. 288 * @param The `LogSystem` instance to use.
272 */ 289 */
273 void SetLogSystem(LogSystemPtr val); 290 void SetLogSystem(const LogSystemPtr& val);
274 291
275 /** 292 /**
276 * Sets a global property that can be accessed by all the scripts. 293 * Sets a global property that can be accessed by all the scripts.
277 * @param name Name of the property to set. 294 * @param name Name of the property to set.
278 * @param value Value of the property to set. 295 * @param value Value of the property to set.
279 */ 296 */
280 void SetGlobalProperty(const std::string& name, AdblockPlus::JsValuePtr valu e); 297 void SetGlobalProperty(const std::string& name, const AdblockPlus::JsValue& value);
281 298
282 /** 299 /**
283 * Returns a pointer to associated v8::Isolate. 300 * Returns a pointer to associated v8::Isolate.
284 */ 301 */
285 v8::Isolate* GetIsolate() 302 v8::Isolate* GetIsolate()
286 { 303 {
287 return isolate->Get(); 304 return isolate->Get();
288 } 305 }
289 306
290 private: 307 private:
291 struct TimerTask 308 void CallTimerTask(const JsWeakValuesID& timerParamsID);
292 {
293 ~TimerTask();
294 std::vector<std::unique_ptr<v8::Persistent<v8::Value>>> arguments;
295 };
296 typedef std::list<TimerTask> TimerTasks;
297 void CallTimerTask(TimerTasks::const_iterator timerTaskIterator);
298 309
299 explicit JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer); 310 explicit JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer);
300 311
301 JsValuePtr GetGlobalObject(); 312 JsValue GetGlobalObject();
302 313
303 /// Isolate must be disposed only after disposing of all objects which are 314 /// Isolate must be disposed only after disposing of all objects which are
304 /// using it. 315 /// using it.
305 ScopedV8IsolatePtr isolate; 316 ScopedV8IsolatePtr isolate;
306 317
307 FileSystemPtr fileSystem; 318 FileSystemPtr fileSystem;
308 WebRequestPtr webRequest; 319 WebRequestPtr webRequest;
309 LogSystemPtr logSystem; 320 LogSystemPtr logSystem;
310 std::unique_ptr<v8::Persistent<v8::Context>> context; 321 std::unique_ptr<v8::Persistent<v8::Context>> context;
311 EventMap eventCallbacks; 322 EventMap eventCallbacks;
312 std::mutex eventCallbacksMutex; 323 std::mutex eventCallbacksMutex;
313 std::mutex isConnectionAllowedMutex; 324 JsWeakValuesLists jsWeakValuesLists;
314 IsConnectionAllowedCallback isConnectionAllowed; 325 std::mutex jsWeakValuesListsMutex;
315 TimerTasks timerTasks;
316 TimerPtr timer; 326 TimerPtr timer;
317 }; 327 };
318 } 328 }
319 329
320 #endif 330 #endif
OLDNEW
« no previous file with comments | « include/AdblockPlus/FilterEngine.h ('k') | include/AdblockPlus/JsValue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld