LEFT | RIGHT |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <http://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2014 Eyeo GmbH | 3 * Copyright (C) 2006-2016 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 |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 #ifndef ADBLOCK_PLUS_FILTER_ENGINE_H | 18 #ifndef ADBLOCK_PLUS_FILTER_ENGINE_H |
19 #define ADBLOCK_PLUS_FILTER_ENGINE_H | 19 #define ADBLOCK_PLUS_FILTER_ENGINE_H |
20 | 20 |
21 #include <functional> | 21 #include <functional> |
22 #include <map> | 22 #include <map> |
23 #include <string> | 23 #include <string> |
24 #include <vector> | 24 #include <vector> |
25 #include <AdblockPlus/JsEngine.h> | 25 #include <AdblockPlus/JsEngine.h> |
26 #include <AdblockPlus/JsValue.h> | 26 #include <AdblockPlus/JsValue.h> |
27 | 27 #include <AdblockPlus/Notification.h> |
28 #include "tr1_memory.h" | |
29 | 28 |
30 namespace AdblockPlus | 29 namespace AdblockPlus |
31 { | 30 { |
32 class FilterEngine; | 31 class FilterEngine; |
33 | 32 |
34 /** | 33 /** |
35 * Wrapper for an Adblock Plus filter object. | 34 * Wrapper for an Adblock Plus filter object. |
36 * There are no accessors for most | 35 * There are no accessors for most |
37 * [filter properties](https://adblockplus.org/jsdoc/adblockplus/symbols/Filte
r.html), | 36 * [filter properties](https://adblockplus.org/jsdoc/adblockpluscore/Filter.ht
ml), |
38 * use `GetProperty()` to retrieve them by name. | 37 * use `GetProperty()` to retrieve them by name. |
39 */ | 38 */ |
40 class Filter : public JsValue, | 39 class Filter : public JsValue, |
41 public std::tr1::enable_shared_from_this<Filter> | 40 public std::enable_shared_from_this<Filter> |
42 { | 41 { |
43 public: | 42 public: |
44 /** | 43 /** |
45 * Filter types, see https://adblockplus.org/en/filters. | 44 * Filter types, see https://adblockplus.org/en/filters. |
46 */ | 45 */ |
47 enum Type {TYPE_BLOCKING, TYPE_EXCEPTION, | 46 enum Type {TYPE_BLOCKING, TYPE_EXCEPTION, |
48 TYPE_ELEMHIDE, TYPE_ELEMHIDE_EXCEPTION, | 47 TYPE_ELEMHIDE, TYPE_ELEMHIDE_EXCEPTION, |
49 TYPE_COMMENT, TYPE_INVALID}; | 48 TYPE_COMMENT, TYPE_INVALID}; |
50 | 49 |
51 /** | 50 /** |
(...skipping 25 matching lines...) Expand all Loading... |
77 * Normally you shouldn't call this directly, but use | 76 * Normally you shouldn't call this directly, but use |
78 * FilterEngine::GetFilter() instead. | 77 * FilterEngine::GetFilter() instead. |
79 * @param value JavaScript filter object. | 78 * @param value JavaScript filter object. |
80 */ | 79 */ |
81 Filter(JsValue&& value); | 80 Filter(JsValue&& value); |
82 }; | 81 }; |
83 | 82 |
84 /** | 83 /** |
85 * Wrapper for a subscription object. | 84 * Wrapper for a subscription object. |
86 * There are no accessors for most | 85 * There are no accessors for most |
87 * [subscription properties](https://adblockplus.org/jsdoc/adblockplus/symbols
/Subscription.html), | 86 * [subscription properties](https://adblockplus.org/jsdoc/adblockpluscore/Sub
scription.html), |
88 * use `GetProperty()` to retrieve them by name. | 87 * use `GetProperty()` to retrieve them by name. |
89 */ | 88 */ |
90 class Subscription : public JsValue, | 89 class Subscription : public JsValue, |
91 public std::tr1::enable_shared_from_this<Subscription> | 90 public std::enable_shared_from_this<Subscription> |
92 { | 91 { |
93 public: | 92 public: |
94 /** | 93 /** |
95 * Checks if this subscription has been added to the list of subscriptions. | 94 * Checks if this subscription has been added to the list of subscriptions. |
96 * @return `true` if this subscription has been added. | 95 * @return `true` if this subscription has been added. |
97 */ | 96 */ |
98 bool IsListed(); | 97 bool IsListed(); |
99 | 98 |
100 /** | 99 /** |
101 * Adds this subscription to the list of subscriptions. | 100 * Adds this subscription to the list of subscriptions. |
(...skipping 24 matching lines...) Expand all Loading... |
126 * Normally you shouldn't call this directly, but use | 125 * Normally you shouldn't call this directly, but use |
127 * FilterEngine::GetSubscription() instead. | 126 * FilterEngine::GetSubscription() instead. |
128 * @param value JavaScript subscription object. | 127 * @param value JavaScript subscription object. |
129 */ | 128 */ |
130 Subscription(JsValue&& value); | 129 Subscription(JsValue&& value); |
131 }; | 130 }; |
132 | 131 |
133 /** | 132 /** |
134 * Shared smart pointer to a `Filter` instance. | 133 * Shared smart pointer to a `Filter` instance. |
135 */ | 134 */ |
136 typedef std::tr1::shared_ptr<Filter> FilterPtr; | 135 typedef std::shared_ptr<Filter> FilterPtr; |
137 | 136 |
138 /** | 137 /** |
139 * Shared smart pointer to a `Subscription` instance. | 138 * Shared smart pointer to a `Subscription` instance. |
140 */ | 139 */ |
141 typedef std::tr1::shared_ptr<Subscription> SubscriptionPtr; | 140 typedef std::shared_ptr<Subscription> SubscriptionPtr; |
142 | 141 |
143 /** | 142 /** |
144 * Main component of libadblockplus. | 143 * Main component of libadblockplus. |
145 * It handles: | 144 * It handles: |
146 * - Filter management and matching. | 145 * - Filter management and matching. |
147 * - Subscription management and synchronization. | 146 * - Subscription management and synchronization. |
148 * - Update checks for the application. | 147 * - Update checks for the application. |
149 */ | 148 */ |
150 class FilterEngine | 149 class FilterEngine |
151 { | 150 { |
152 public: | 151 public: |
153 // Make sure to keep ContentType in sync with FilterEngine::contentTypes | 152 // Make sure to keep ContentType in sync with FilterEngine::contentTypes |
| 153 // and with RegExpFilter.typeMap from filterClasses.js. |
154 /** | 154 /** |
155 * Possible resource content types. | 155 * Possible resource content types. |
156 */ | 156 */ |
157 enum ContentType {CONTENT_TYPE_OTHER, CONTENT_TYPE_SCRIPT, | 157 enum ContentType |
158 CONTENT_TYPE_IMAGE, CONTENT_TYPE_STYLESHEET, | 158 { |
159 CONTENT_TYPE_OBJECT, CONTENT_TYPE_SUBDOCUMENT, | 159 CONTENT_TYPE_OTHER = 1, |
160 CONTENT_TYPE_DOCUMENT, CONTENT_TYPE_XMLHTTPREQUEST, | 160 CONTENT_TYPE_SCRIPT = 2, |
161 CONTENT_TYPE_OBJECT_SUBREQUEST, CONTENT_TYPE_FONT, | 161 CONTENT_TYPE_IMAGE = 4, |
162 CONTENT_TYPE_MEDIA}; | 162 CONTENT_TYPE_STYLESHEET = 8, |
| 163 CONTENT_TYPE_OBJECT = 16, |
| 164 CONTENT_TYPE_SUBDOCUMENT = 32, |
| 165 CONTENT_TYPE_DOCUMENT = 64, |
| 166 CONTENT_TYPE_PING = 1024, |
| 167 CONTENT_TYPE_XMLHTTPREQUEST = 2048, |
| 168 CONTENT_TYPE_OBJECT_SUBREQUEST = 4096, |
| 169 CONTENT_TYPE_MEDIA = 16384, |
| 170 CONTENT_TYPE_FONT = 32768, |
| 171 CONTENT_TYPE_GENERICBLOCK = 0x20000000, |
| 172 CONTENT_TYPE_ELEMHIDE = 0x40000000, |
| 173 CONTENT_TYPE_GENERICHIDE = 0x80000000 |
| 174 }; |
| 175 |
| 176 /** |
| 177 * Bitmask of `ContentType` values. |
| 178 * The underlying type is signed 32 bit integer because it is actually used |
| 179 * in JavaScript where it is converted into 32 bit signed integer. |
| 180 */ |
| 181 typedef int32_t ContentTypeMask; |
163 | 182 |
164 /** | 183 /** |
165 * Callback type invoked when an update becomes available. | 184 * Callback type invoked when an update becomes available. |
166 * The parameter is the download URL of the update. | 185 * The parameter is the download URL of the update. |
167 */ | 186 */ |
168 typedef std::tr1::function<void(const std::string&)> | 187 typedef std::function<void(const std::string&)> UpdateAvailableCallback; |
169 UpdateAvailableCallback; | |
170 | 188 |
171 /** | 189 /** |
172 * Callback type invoked when a manually triggered update check finishes. | 190 * Callback type invoked when a manually triggered update check finishes. |
173 * The parameter is an optional error message. | 191 * The parameter is an optional error message. |
174 */ | 192 */ |
175 typedef std::tr1::function<void(const std::string&)> | 193 typedef std::function<void(const std::string&)> UpdateCheckDoneCallback; |
176 UpdateCheckDoneCallback; | |
177 | 194 |
178 /** | 195 /** |
179 * Callback type invoked when the filters change. | 196 * Callback type invoked when the filters change. |
180 * The first parameter is the action event code (see | 197 * The first parameter is the action event code (see |
181 * [FilterNotifier.triggerListeners](https://adblockplus.org/jsdoc/adblockpl
us/symbols/FilterNotifier.html#.triggerListeners) | 198 * [FilterNotifier.triggerListeners](https://adblockplus.org/jsdoc/adblockpl
uscore/FilterNotifier.html#.triggerListeners) |
182 * for the full list). | 199 * for the full list). |
183 * The second parameter is the filter/subscription object affected, if any. | 200 * The second parameter is the filter/subscription object affected, if any. |
184 */ | 201 */ |
185 typedef std::tr1::function<void(const std::string&, const JsValuePtr)> Filte
rChangeCallback; | 202 typedef std::function<void(const std::string&, const JsValuePtr)> FilterChan
geCallback; |
| 203 |
| 204 /** |
| 205 * Container of name-value pairs representing a set of preferences. |
| 206 */ |
| 207 typedef std::map<std::string, AdblockPlus::JsValuePtr> Prefs; |
| 208 |
| 209 /** |
| 210 * Callback type invoked when a new notification should be shown. |
| 211 * The parameter is the Notification object to be shown. |
| 212 */ |
| 213 typedef std::function<void(const NotificationPtr&)> ShowNotificationCallback
; |
186 | 214 |
187 /** | 215 /** |
188 * Constructor. | 216 * Constructor. |
189 * @param jsEngine `JsEngine` instance used to run JavaScript code | 217 * @param jsEngine `JsEngine` instance used to run JavaScript code |
190 * internally. | 218 * internally. |
191 */ | 219 * @param preconfiguredPrefs `AdblockPlus::FilterEngine::Prefs` |
192 explicit FilterEngine(JsEnginePtr jsEngine); | 220 * name-value list of preconfigured prefs. |
| 221 */ |
| 222 explicit FilterEngine(JsEnginePtr jsEngine, |
| 223 const Prefs& preconfiguredPrefs = Prefs() |
| 224 ); |
193 | 225 |
194 /** | 226 /** |
195 * Retrieves the `JsEngine` instance associated with this `FilterEngine` | 227 * Retrieves the `JsEngine` instance associated with this `FilterEngine` |
196 * instance. | 228 * instance. |
197 */ | 229 */ |
198 JsEnginePtr GetJsEngine() const { return jsEngine; } | 230 JsEnginePtr GetJsEngine() const { return jsEngine; } |
199 | 231 |
200 /** | 232 /** |
201 * Checks if this is the first run of the application. | 233 * Checks if this is the first run of the application. |
202 * @return `true` if the application is running for the first time. | 234 * @return `true` if the application is running for the first time. |
(...skipping 27 matching lines...) Expand all Loading... |
230 */ | 262 */ |
231 std::vector<SubscriptionPtr> GetListedSubscriptions() const; | 263 std::vector<SubscriptionPtr> GetListedSubscriptions() const; |
232 | 264 |
233 /** | 265 /** |
234 * Retrieves all recommended subscriptions. | 266 * Retrieves all recommended subscriptions. |
235 * @return List of recommended subscriptions. | 267 * @return List of recommended subscriptions. |
236 */ | 268 */ |
237 std::vector<SubscriptionPtr> FetchAvailableSubscriptions() const; | 269 std::vector<SubscriptionPtr> FetchAvailableSubscriptions() const; |
238 | 270 |
239 /** | 271 /** |
| 272 * Invokes the listener set via SetNotificationAvailableCallback() with the |
| 273 * next notification to be shown. |
| 274 * @param url URL to match notifications to (optional). |
| 275 */ |
| 276 void ShowNextNotification(const std::string& url = std::string()); |
| 277 |
| 278 /** |
| 279 * Sets the callback invoked when a notification should be shown. |
| 280 * @param callback Callback to invoke. |
| 281 */ |
| 282 void SetShowNotificationCallback(const ShowNotificationCallback& value); |
| 283 |
| 284 /** |
| 285 * Removes the callback invoked when a notification should be shown. |
| 286 */ |
| 287 void RemoveShowNotificationCallback(); |
| 288 |
| 289 /** |
240 * Checks if any active filter matches the supplied URL. | 290 * Checks if any active filter matches the supplied URL. |
241 * @param url URL to match. | 291 * @param url URL to match. |
242 * @param contentType Content type of the requested resource. | 292 * @param contentTypeMask Content type mask of the requested resource. |
243 * @param documentUrl URL of the document requesting the resource. | 293 * @param documentUrl URL of the document requesting the resource. |
244 * Note that there will be more than one document if frames are | 294 * Note that there will be more than one document if frames are |
245 * involved, see | 295 * involved, see |
246 * Matches(const std::string&, const std::string&, const std::vector<
std::string>&) const. | 296 * Matches(const std::string&, const std::string&, const std::vector<
std::string>&) const. |
247 * @return Matching filter, or `null` if there was no match. | 297 * @return Matching filter, or `null` if there was no match. |
248 * @throw `std::invalid_argument`, if an invalid `contentType` was supplied. | 298 * @throw `std::invalid_argument`, if an invalid `contentType` was supplied. |
249 */ | 299 */ |
250 FilterPtr Matches(const std::string& url, | 300 FilterPtr Matches(const std::string& url, |
251 ContentType contentType, | 301 ContentTypeMask contentTypeMask, |
252 const std::string& documentUrl) const; | 302 const std::string& documentUrl) const; |
253 | 303 |
254 /** | 304 /** |
255 * Checks if any active filter matches the supplied URL. | 305 * Checks if any active filter matches the supplied URL. |
256 * @param url URL to match. | 306 * @param url URL to match. |
257 * @param contentType Content type of the requested resource. | 307 * @param contentTypeMask Content type mask of the requested resource. |
258 * @param documentUrls Chain of documents requesting the resource, starting | 308 * @param documentUrls Chain of documents requesting the resource, starting |
259 * with the current resource's parent frame, ending with the | 309 * with the current resource's parent frame, ending with the |
260 * top-level frame. | 310 * top-level frame. |
261 * If the application is not capable of identifying the frame | 311 * If the application is not capable of identifying the frame |
262 * structure, e.g. because it is a proxy, it can be approximated | 312 * structure, e.g. because it is a proxy, it can be approximated |
263 * using `ReferrerMapping`. | 313 * using `ReferrerMapping`. |
264 * @return Matching filter, or a `null` if there was no match. | 314 * @return Matching filter, or a `null` if there was no match. |
265 * @throw `std::invalid_argument`, if an invalid `contentType` was supplied. | 315 * @throw `std::invalid_argument`, if an invalid `contentType` was supplied. |
266 */ | 316 */ |
267 FilterPtr Matches(const std::string& url, | 317 FilterPtr Matches(const std::string& url, |
268 ContentType contentType, | 318 ContentTypeMask contentTypeMask, |
| 319 const std::vector<std::string>& documentUrls) const; |
| 320 |
| 321 /** |
| 322 * Checks whether the document at the supplied URL is whitelisted. |
| 323 * @param url URL of the document. |
| 324 * @param documentUrls Chain of document URLs requesting the document, |
| 325 * starting with the current document's parent frame, ending with |
| 326 * the top-level frame. |
| 327 * If the application is not capable of identifying the frame |
| 328 * structure, e.g. because it is a proxy, it can be approximated |
| 329 * using `ReferrerMapping`. |
| 330 * @return `true` if the URL is whitelisted. |
| 331 */ |
| 332 bool IsDocumentWhitelisted(const std::string& url, |
| 333 const std::vector<std::string>& documentUrls) const; |
| 334 |
| 335 /** |
| 336 * Checks whether element hiding is disabled at the supplied URL. |
| 337 * @param url URL of the document. |
| 338 * @param documentUrls Chain of document URLs requesting the document, |
| 339 * starting with the current document's parent frame, ending with |
| 340 * the top-level frame. |
| 341 * If the application is not capable of identifying the frame |
| 342 * structure, e.g. because it is a proxy, it can be approximated |
| 343 * using `ReferrerMapping`. |
| 344 * @return `true` if element hiding is whitelisted for the supplied URL. |
| 345 */ |
| 346 bool IsElemhideWhitelisted(const std::string& url, |
269 const std::vector<std::string>& documentUrls) const; | 347 const std::vector<std::string>& documentUrls) const; |
270 | 348 |
271 /** | 349 /** |
272 * Retrieves CSS selectors for all element hiding filters active on the | 350 * Retrieves CSS selectors for all element hiding filters active on the |
273 * supplied domain. | 351 * supplied domain. |
274 * @param domain Domain to retrieve CSS selectors for. | 352 * @param domain Domain to retrieve CSS selectors for. |
275 * @return List of CSS selectors. | 353 * @return List of CSS selectors. |
276 */ | 354 */ |
277 std::vector<std::string> GetElementHidingSelectors(const std::string& domain
) const; | 355 std::vector<std::string> GetElementHidingSelectors(const std::string& domain
) const; |
278 | 356 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 * `FilterEngine` will automatically check for updates in regular intervals, | 392 * `FilterEngine` will automatically check for updates in regular intervals, |
315 * so applications should only call this when the user triggers an update | 393 * so applications should only call this when the user triggers an update |
316 * check manually. | 394 * check manually. |
317 * @param callback Optional callback to invoke when the update check is | 395 * @param callback Optional callback to invoke when the update check is |
318 * finished. The string parameter will be empty when the update check | 396 * finished. The string parameter will be empty when the update check |
319 * succeeded, or contain an error message if it failed. | 397 * succeeded, or contain an error message if it failed. |
320 * Note that the callback will be invoked whether updates are | 398 * Note that the callback will be invoked whether updates are |
321 * available or not - to react to updates being available, use | 399 * available or not - to react to updates being available, use |
322 * `FilterEngine::SetUpdateAvailableCallback()`. | 400 * `FilterEngine::SetUpdateAvailableCallback()`. |
323 */ | 401 */ |
324 void ForceUpdateCheck(UpdateCheckDoneCallback callback = 0); | 402 void ForceUpdateCheck(UpdateCheckDoneCallback callback); |
325 | 403 |
326 /** | 404 /** |
327 * Sets the callback invoked when the filters change. | 405 * Sets the callback invoked when the filters change. |
328 * @param callback Callback to invoke. | 406 * @param callback Callback to invoke. |
329 */ | 407 */ |
330 void SetFilterChangeCallback(FilterChangeCallback callback); | 408 void SetFilterChangeCallback(FilterChangeCallback callback); |
331 | 409 |
332 /** | 410 /** |
333 * Removes the callback invoked when the filters change. | 411 * Removes the callback invoked when the filters change. |
334 */ | 412 */ |
(...skipping 29 matching lines...) Expand all Loading... |
364 | 442 |
365 private: | 443 private: |
366 JsEnginePtr jsEngine; | 444 JsEnginePtr jsEngine; |
367 bool initialized; | 445 bool initialized; |
368 bool firstRun; | 446 bool firstRun; |
369 int updateCheckId; | 447 int updateCheckId; |
370 static const std::map<ContentType, std::string> contentTypes; | 448 static const std::map<ContentType, std::string> contentTypes; |
371 | 449 |
372 void InitDone(JsValueList& params); | 450 void InitDone(JsValueList& params); |
373 FilterPtr CheckFilterMatch(const std::string& url, | 451 FilterPtr CheckFilterMatch(const std::string& url, |
374 ContentType contentType, | 452 ContentTypeMask contentTypeMask, |
375 const std::string& documentUrl) const; | 453 const std::string& documentUrl) const; |
376 void UpdateAvailable(UpdateAvailableCallback callback, JsValueList& params); | 454 void UpdateAvailable(UpdateAvailableCallback callback, JsValueList& params); |
377 void UpdateCheckDone(const std::string& eventName, | 455 void UpdateCheckDone(const std::string& eventName, |
378 UpdateCheckDoneCallback callback, JsValueList& params); | 456 UpdateCheckDoneCallback callback, JsValueList& params); |
379 void FilterChanged(FilterChangeCallback callback, JsValueList& params); | 457 void FilterChanged(FilterChangeCallback callback, JsValueList& params); |
| 458 void ShowNotification(const ShowNotificationCallback& callback, |
| 459 const JsValueList& params); |
| 460 FilterPtr GetWhitelistingFilter(const std::string& url, |
| 461 ContentTypeMask contentTypeMask, const std::string& documentUrl) const; |
| 462 FilterPtr GetWhitelistingFilter(const std::string& url, |
| 463 ContentTypeMask contentTypeMask, |
| 464 const std::vector<std::string>& documentUrls) const; |
380 }; | 465 }; |
381 } | 466 } |
382 | 467 |
383 #endif | 468 #endif |
LEFT | RIGHT |