| 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-2016 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 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 result[keys[i]] = obj[keys[i]]; | 47 result[keys[i]] = obj[keys[i]]; |
| 48 return result; | 48 return result; |
| 49 } | 49 } |
| 50 | 50 |
| 51 var convertSubscription = convertObject.bind(null, ["disabled", | 51 var convertSubscription = convertObject.bind(null, ["disabled", |
| 52 "downloadStatus", "homepage", "lastDownload", "title", "url"]); | 52 "downloadStatus", "homepage", "lastDownload", "title", "url"]); |
| 53 var convertFilter = convertObject.bind(null, ["text"]); | 53 var convertFilter = convertObject.bind(null, ["text"]); |
| 54 | 54 |
| 55 var changeListeners = new global.ext.PageMap(); | 55 var changeListeners = new global.ext.PageMap(); |
| 56 var listenedPreferences = []; | 56 var listenedPreferences = []; |
| 57 var listenedFilterChanges = []; |
| 57 var messageTypes = { | 58 var messageTypes = { |
| 58 "app": "app.listen", | 59 "app": "app.listen", |
| 59 "filter": "filters.listen", | 60 "filter": "filters.listen", |
| 60 "pref": "prefs.listen", | 61 "pref": "prefs.listen", |
| 61 "subscription": "subscriptions.listen" | 62 "subscription": "subscriptions.listen" |
| 62 }; | 63 }; |
| 63 | 64 |
| 64 function sendMessage(type, action, args) | 65 function sendMessage(type, action) |
| 65 { | 66 { |
| 66 var pages = changeListeners.keys(); | 67 var pages = changeListeners.keys(); |
| 67 for (var i = 0; i < pages.length; i++) | 68 if (pages.length == 0) |
| 68 { | |
| 69 var filters = changeListeners.get(pages[i]); | |
| 70 var actions = filters[type]; | |
| 71 if (actions && actions.indexOf(action) != -1) | |
| 72 { | |
| 73 pages[i].sendMessage({ | |
| 74 type: messageTypes[type], | |
| 75 action: action, | |
| 76 args: args | |
| 77 }); | |
| 78 } | |
| 79 } | |
| 80 } | |
| 81 | |
| 82 function onFilterChange(action) | |
| 83 { | |
| 84 var type; | |
| 85 if (action == "load") | |
| 86 { | |
| 87 type = "filter"; | |
| 88 action = "loaded"; | |
| 89 } | |
| 90 else | |
| 91 { | |
| 92 var parts = action.split("."); | |
| 93 type = parts[0]; | |
| 94 action = parts[1]; | |
| 95 } | |
| 96 | |
| 97 if (!(type in messageTypes)) | |
| 98 return; | 69 return; |
| 99 | 70 |
| 100 var args = []; | 71 var args = []; |
| 101 for (var i = 1; i < arguments.length; i++) | 72 for (var i = 2; i < arguments.length; i++) |
| 102 { | 73 { |
| 103 var arg = arguments[i]; | 74 var arg = arguments[i]; |
| 104 if (arg instanceof Subscription) | 75 if (arg instanceof Subscription) |
| 105 args.push(convertSubscription(arg)); | 76 args.push(convertSubscription(arg)); |
| 106 else if (arg instanceof Filter) | 77 else if (arg instanceof Filter) |
| 107 args.push(convertFilter(arg)); | 78 args.push(convertFilter(arg)); |
| 108 else | 79 else |
| 109 args.push(arg); | 80 args.push(arg); |
| 110 } | 81 } |
| 111 | 82 |
| 112 sendMessage(type, action, args); | 83 for (var j = 0; j < pages.length; j++) |
| 84 { |
| 85 var page = pages[j]; |
| 86 var filters = changeListeners.get(page); |
| 87 var actions = filters[type]; |
| 88 if (actions && actions.indexOf(action) != -1) |
| 89 { |
| 90 page.sendMessage({ |
| 91 type: messageTypes[type], |
| 92 action: action, |
| 93 args: args |
| 94 }); |
| 95 } |
| 96 } |
| 97 } |
| 98 |
| 99 function addFilterListeners(type, actions) |
| 100 { |
| 101 actions.forEach(function(action) |
| 102 { |
| 103 var name; |
| 104 if (type == "filter" && action == "loaded") |
| 105 name = "load"; |
| 106 else |
| 107 name = type + "." + action; |
| 108 |
| 109 if (listenedFilterChanges.indexOf(name) == -1) |
| 110 { |
| 111 listenedFilterChanges.push(name); |
| 112 FilterNotifier.on(name, function() |
| 113 { |
| 114 var args = [type, action]; |
| 115 for (var i = 0; i < arguments.length; i++) |
| 116 args.push(arguments[i]); |
| 117 sendMessage.apply(null, args); |
| 118 }); |
| 119 } |
| 120 }); |
| 113 } | 121 } |
| 114 | 122 |
| 115 function getListenerFilters(page) | 123 function getListenerFilters(page) |
| 116 { | 124 { |
| 117 var listenerFilters = changeListeners.get(page); | 125 var listenerFilters = changeListeners.get(page); |
| 118 if (!listenerFilters) | 126 if (!listenerFilters) |
| 119 { | 127 { |
| 120 listenerFilters = Object.create(null); | 128 listenerFilters = Object.create(null); |
| 121 changeListeners.set(page, listenerFilters); | 129 changeListeners.set(page, listenerFilters); |
| 122 } | 130 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 devToolsPanel: info.platform == "chromium", | 178 devToolsPanel: info.platform == "chromium", |
| 171 safariContentBlocker: "safari" in global | 179 safariContentBlocker: "safari" in global |
| 172 && "extension" in global.safari | 180 && "extension" in global.safari |
| 173 && "setContentBlocker" in global.safari.extension | 181 && "setContentBlocker" in global.safari.extension |
| 174 }); | 182 }); |
| 175 } | 183 } |
| 176 else | 184 else |
| 177 callback(null); | 185 callback(null); |
| 178 break; | 186 break; |
| 179 case "app.listen": | 187 case "app.listen": |
| 180 var listenerFilters = getListenerFilters(sender.page); | 188 getListenerFilters(sender.page).app = message.filter; |
| 181 if (message.filter) | |
| 182 listenerFilters.app = message.filter; | |
| 183 else | |
| 184 delete listenerFilters.app; | |
| 185 break; | 189 break; |
| 186 case "app.open": | 190 case "app.open": |
| 187 if (message.what == "options") | 191 if (message.what == "options") |
| 188 ext.showOptions(); | 192 ext.showOptions(); |
| 189 break; | 193 break; |
| 190 case "filters.add": | 194 case "filters.add": |
| 191 var result = require("filterValidation").parseFilter(message.text); | 195 var result = require("filterValidation").parseFilter(message.text); |
| 192 var errors = []; | 196 var errors = []; |
| 193 if (result.error) | 197 if (result.error) |
| 194 errors.push(result.error.toString()); | 198 errors.push(result.error.toString()); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 var filter = subscription.filters[j]; | 275 var filter = subscription.filters[j]; |
| 272 if (/^@@\|\|([^\/:]+)\^\$document$/.test(filter.text)) | 276 if (/^@@\|\|([^\/:]+)\^\$document$/.test(filter.text)) |
| 273 continue; | 277 continue; |
| 274 | 278 |
| 275 if (!(filter.text in seenFilter)) | 279 if (!(filter.text in seenFilter)) |
| 276 FilterStorage.removeFilter(filter); | 280 FilterStorage.removeFilter(filter); |
| 277 } | 281 } |
| 278 } | 282 } |
| 279 break; | 283 break; |
| 280 case "filters.listen": | 284 case "filters.listen": |
| 281 var listenerFilters = getListenerFilters(sender.page); | 285 getListenerFilters(sender.page).filter = message.filter; |
| 282 if (message.filter) | 286 addFilterListeners("filter", message.filter); |
| 283 { | |
| 284 FilterNotifier.addListener(onFilterChange); | |
| 285 listenerFilters.filter = message.filter; | |
| 286 } | |
| 287 else | |
| 288 delete listenerFilters.filter; | |
| 289 break; | 287 break; |
| 290 case "filters.remove": | 288 case "filters.remove": |
| 291 var filter = Filter.fromText(message.text); | 289 var filter = Filter.fromText(message.text); |
| 292 var subscription = null; | 290 var subscription = null; |
| 293 if (message.subscriptionUrl) | 291 if (message.subscriptionUrl) |
| 294 subscription = Subscription.fromURL(message.subscriptionUrl); | 292 subscription = Subscription.fromURL(message.subscriptionUrl); |
| 295 | 293 |
| 296 if (!subscription) | 294 if (!subscription) |
| 297 FilterStorage.removeFilter(filter); | 295 FilterStorage.removeFilter(filter); |
| 298 else | 296 else |
| 299 FilterStorage.removeFilter(filter, subscription, message.index); | 297 FilterStorage.removeFilter(filter, subscription, message.index); |
| 300 break; | 298 break; |
| 301 case "prefs.get": | 299 case "prefs.get": |
| 302 callback(Prefs[message.key]); | 300 callback(Prefs[message.key]); |
| 303 break; | 301 break; |
| 304 case "prefs.listen": | 302 case "prefs.listen": |
| 305 var listenerFilters = getListenerFilters(sender.page); | 303 getListenerFilters(sender.page).pref = message.filter; |
| 306 if (message.filter) | 304 message.filter.forEach(function(preference) |
| 307 { | 305 { |
| 308 message.filter.forEach(function(preference) | 306 if (listenedPreferences.indexOf(preference) == -1) |
| 309 { | 307 { |
| 310 if (listenedPreferences.indexOf(preference) == -1) | 308 listenedPreferences.push(preference); |
| 309 Prefs.on(preference, function() |
| 311 { | 310 { |
| 312 listenedPreferences.push(preference); | 311 sendMessage("pref", preference, Prefs[preference]); |
| 313 Prefs.on(preference, function() | 312 }); |
| 314 { | 313 } |
| 315 sendMessage("pref", preference, [Prefs[preference]]); | 314 }); |
| 316 }); | |
| 317 } | |
| 318 }); | |
| 319 listenerFilters.pref = message.filter; | |
| 320 } | |
| 321 else | |
| 322 delete listenerFilters.pref; | |
| 323 break; | 315 break; |
| 324 case "prefs.toggle": | 316 case "prefs.toggle": |
| 325 if (message.key == "notifications_ignoredcategories") | 317 if (message.key == "notifications_ignoredcategories") |
| 326 NotificationStorage.toggleIgnoreCategory("*"); | 318 NotificationStorage.toggleIgnoreCategory("*"); |
| 327 else | 319 else |
| 328 Prefs[message.key] = !Prefs[message.key]; | 320 Prefs[message.key] = !Prefs[message.key]; |
| 329 break; | 321 break; |
| 330 case "subscriptions.add": | 322 case "subscriptions.add": |
| 331 var subscription = Subscription.fromURL(message.url); | 323 var subscription = Subscription.fromURL(message.url); |
| 332 if ("title" in message) | 324 if ("title" in message) |
| 333 subscription.title = message.title; | 325 subscription.title = message.title; |
| 334 if ("homepage" in message) | 326 if ("homepage" in message) |
| 335 subscription.homepage = message.homepage; | 327 subscription.homepage = message.homepage; |
| 336 | 328 |
| 337 if (message.confirm) | 329 if (message.confirm) |
| 338 { | 330 { |
| 339 ext.showOptions(function() | 331 ext.showOptions(function() |
| 340 { | 332 { |
| 341 sendMessage("app", "addSubscription", [convertSubscription(subscript
ion)]); | 333 sendMessage("app", "addSubscription", subscription); |
| 342 }); | 334 }); |
| 343 } | 335 } |
| 344 else | 336 else |
| 345 { | 337 { |
| 346 subscription.disabled = false; | 338 subscription.disabled = false; |
| 347 FilterStorage.addSubscription(subscription); | 339 FilterStorage.addSubscription(subscription); |
| 348 | 340 |
| 349 if (subscription instanceof DownloadableSubscription && !subscription.
lastDownload) | 341 if (subscription instanceof DownloadableSubscription && !subscription.
lastDownload) |
| 350 Synchronizer.execute(subscription); | 342 Synchronizer.execute(subscription); |
| 351 } | 343 } |
| 352 break; | 344 break; |
| 353 case "subscriptions.get": | 345 case "subscriptions.get": |
| 354 var subscriptions = FilterStorage.subscriptions.filter(function(s) | 346 var subscriptions = FilterStorage.subscriptions.filter(function(s) |
| 355 { | 347 { |
| 356 if (message.ignoreDisabled && s.disabled) | 348 if (message.ignoreDisabled && s.disabled) |
| 357 return false; | 349 return false; |
| 358 if (s instanceof DownloadableSubscription && message.downloadable) | 350 if (s instanceof DownloadableSubscription && message.downloadable) |
| 359 return true; | 351 return true; |
| 360 if (s instanceof SpecialSubscription && message.special) | 352 if (s instanceof SpecialSubscription && message.special) |
| 361 return true; | 353 return true; |
| 362 return false; | 354 return false; |
| 363 }); | 355 }); |
| 364 callback(subscriptions.map(convertSubscription)); | 356 callback(subscriptions.map(convertSubscription)); |
| 365 break; | 357 break; |
| 366 case "subscriptions.listen": | 358 case "subscriptions.listen": |
| 367 var listenerFilters = getListenerFilters(sender.page); | 359 getListenerFilters(sender.page).subscription = message.filter; |
| 368 if (message.filter) | 360 addFilterListeners("subscription", message.filter); |
| 369 { | |
| 370 FilterNotifier.addListener(onFilterChange); | |
| 371 listenerFilters.subscription = message.filter; | |
| 372 } | |
| 373 else | |
| 374 delete listenerFilters.subscription; | |
| 375 break; | 361 break; |
| 376 case "subscriptions.remove": | 362 case "subscriptions.remove": |
| 377 var subscription = Subscription.fromURL(message.url); | 363 var subscription = Subscription.fromURL(message.url); |
| 378 if (subscription.url in FilterStorage.knownSubscriptions) | 364 if (subscription.url in FilterStorage.knownSubscriptions) |
| 379 FilterStorage.removeSubscription(subscription); | 365 FilterStorage.removeSubscription(subscription); |
| 380 break; | 366 break; |
| 381 case "subscriptions.toggle": | 367 case "subscriptions.toggle": |
| 382 var subscription = Subscription.fromURL(message.url); | 368 var subscription = Subscription.fromURL(message.url); |
| 383 if (subscription.url in FilterStorage.knownSubscriptions) | 369 if (subscription.url in FilterStorage.knownSubscriptions) |
| 384 { | 370 { |
| 385 if (subscription.disabled || message.keepInstalled) | 371 if (subscription.disabled || message.keepInstalled) |
| 386 { | |
| 387 subscription.disabled = !subscription.disabled; | 372 subscription.disabled = !subscription.disabled; |
| 388 FilterNotifier.triggerListeners("subscription.disabled", | |
| 389 subscription); | |
| 390 } | |
| 391 else | 373 else |
| 392 FilterStorage.removeSubscription(subscription); | 374 FilterStorage.removeSubscription(subscription); |
| 393 } | 375 } |
| 394 else | 376 else |
| 395 { | 377 { |
| 396 subscription.disabled = false; | 378 subscription.disabled = false; |
| 397 subscription.title = message.title; | 379 subscription.title = message.title; |
| 398 subscription.homepage = message.homepage; | 380 subscription.homepage = message.homepage; |
| 399 FilterStorage.addSubscription(subscription); | 381 FilterStorage.addSubscription(subscription); |
| 400 if (!subscription.lastDownload) | 382 if (!subscription.lastDownload) |
| 401 Synchronizer.execute(subscription); | 383 Synchronizer.execute(subscription); |
| 402 } | 384 } |
| 403 break; | 385 break; |
| 404 case "subscriptions.update": | 386 case "subscriptions.update": |
| 405 var subscriptions = message.url ? [Subscription.fromURL(message.url)] : | 387 var subscriptions = message.url ? [Subscription.fromURL(message.url)] : |
| 406 FilterStorage.subscriptions; | 388 FilterStorage.subscriptions; |
| 407 for (var i = 0; i < subscriptions.length; i++) | 389 for (var i = 0; i < subscriptions.length; i++) |
| 408 { | 390 { |
| 409 var subscription = subscriptions[i]; | 391 var subscription = subscriptions[i]; |
| 410 if (subscription instanceof DownloadableSubscription) | 392 if (subscription instanceof DownloadableSubscription) |
| 411 Synchronizer.execute(subscription, true); | 393 Synchronizer.execute(subscription, true); |
| 412 } | 394 } |
| 413 break; | 395 break; |
| 414 case "subscriptions.isDownloading": | 396 case "subscriptions.isDownloading": |
| 415 callback(Synchronizer.isExecuting(message.url)); | 397 callback(Synchronizer.isExecuting(message.url)); |
| 416 break; | 398 break; |
| 417 } | 399 } |
| 418 }); | 400 }); |
| 419 })(this); | 401 })(this); |
| OLD | NEW |