diff --git a/platform/chromium/manifest.json b/platform/chromium/manifest.json index 358c372c7..0c8ea5b02 100644 --- a/platform/chromium/manifest.json +++ b/platform/chromium/manifest.json @@ -36,6 +36,15 @@ "js": ["js/contentscript-end.js"], "run_at": "document_end", "all_frames": true + }, + { + "matches": [ + "https://*.adblockplus.org/*", + "https://*.adblockplus.me/*", + "https://www.fanboy.co.nz/*" + ], + "js": ["js/subscriber.js"], + "run_at": "document_idle" } ], "minimum_chrome_version": "22.0", diff --git a/platform/firefox/frameModule.js b/platform/firefox/frameModule.js index 3a16c70a7..cd513dc17 100644 --- a/platform/firefox/frameModule.js +++ b/platform/firefox/frameModule.js @@ -55,6 +55,11 @@ const contentObserver = { cpMessageName: hostName + ':shouldLoad', ignoredPopups: new WeakMap(), uniqueSandboxId: 1, + subscriberTargets: { + 'adblockplus.org': true, + 'adblockplus.me': true, + 'fanboy.co.nz': true + }, get componentRegistrar() { return Components.manager.QueryInterface(Ci.nsIComponentRegistrar); @@ -295,6 +300,27 @@ const contentObserver = { }; subject.addEventListener('DOMContentLoaded', docReady, true); + +/* Does not work, I do not know why + + let docIdle = function(e) { + this.removeEventListener(e.type, docIdle); + lss(this.contentBaseURI + 'subscriber.js', sandbox); + }; + + var target = loc.host; + while ( target !== '' ) { + if ( this.subscriberTargets.hasOwnProperty(target) ) { + subject.addEventListener('load', docIdle); + break; + } + let pos = target.indexOf('.'); + if ( pos === -1 ) { + break; + } + target = target.slice(pos + 1); + } +*/ } }; diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index 816bdbb7f..bb9a86f98 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -519,6 +519,10 @@ "message":"Unable to connect to {{url}}", "description":"English: Network error: unable to connect to {{url}}" }, + "subscriberConfirm":{ + "message":"µBlock: Add the following resource to your selection of filter lists?\n\nTitle: \"{{title}}\"\nURL: {{url}}", + "description":"English: Network error: unable to connect to {{url}}" + }, "dummy":{ "message":"This entry must be the last one", "description":"so we dont need to deal with comma for last entry" diff --git a/src/js/messaging.js b/src/js/messaging.js index 30daad155..40d9e4517 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global µBlock, vAPI, YaMD5 */ +/* global µBlock, vAPI */ /******************************************************************************/ /******************************************************************************/ @@ -279,6 +279,7 @@ var onMessage = function(request, sender, callback) { } // Sync + var pageStore; var response; switch ( request.what ) { @@ -290,7 +291,7 @@ var onMessage = function(request, sender, callback) { break; case 'hasPopupContentChanged': - var pageStore = µb.pageStoreFromTabId(request.tabId); + pageStore = µb.pageStoreFromTabId(request.tabId); var lastModified = pageStore ? pageStore.contentLastModified : 0; response = lastModified !== request.contentLastModified; break; @@ -310,7 +311,7 @@ var onMessage = function(request, sender, callback) { break; case 'toggleNetFiltering': - var pageStore = µb.pageStoreFromTabId(request.tabId); + pageStore = µb.pageStoreFromTabId(request.tabId); if ( pageStore ) { pageStore.toggleNetFilteringSwitch(request.url, request.scope, request.state); µb.updateBadgeAsync(request.tabId); @@ -666,9 +667,6 @@ var onMessage = function(request, sender, callback) { case 'purgeAllCaches': return µb.assets.purgeAll(callback); - case 'writeUserUbiquitousBlockRules': - return µb.assets.put(µb.userFiltersPath, request.content, callback); - default: break; } @@ -1133,3 +1131,47 @@ vAPI.messaging.listen('devtool-log.js', onMessage); // https://www.youtube.com/watch?v=3_WcygKJP1k /******************************************************************************/ +/******************************************************************************/ + +// subscriber.js + +(function() { + +'use strict'; + +/******************************************************************************/ + +var onMessage = function(request, sender, callback) { + // Async + switch ( request.what ) { + default: + break; + } + + // Sync + var response; + + switch ( request.what ) { + case 'subscriberData': + response = { + confirmStr: vAPI.i18n('subscriberConfirm'), + externalLists: µBlock.userSettings.externalLists + }; + break; + + default: + return vAPI.messaging.UNHANDLED; + } + + callback(response); +}; + +vAPI.messaging.listen('subscriber.js', onMessage); + +/******************************************************************************/ + +})(); + +// https://www.youtube.com/watch?v=3_WcygKJP1k + +/******************************************************************************/ diff --git a/src/js/storage.js b/src/js/storage.js index cc421850f..c75980116 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -527,15 +527,27 @@ return; } + // Only the lists referenced by the switches are touched. + var filterLists = µb.remoteBlacklists; + var entry, state, location; var i = switches.length; while ( i-- ) { - if ( filterLists.hasOwnProperty(switches[i].location) === false ) { + entry = switches[i]; + state = entry.off === true; + location = entry.location; + if ( filterLists.hasOwnProperty(location) === false ) { + if ( state !== true ) { + filterLists[location] = { off: state }; + } continue; } - filterLists[switches[i].location].off = !!switches[i].off; + if ( filterLists[location].off === state ) { + continue; + } + filterLists[location].off = state; } - // Save switch states + vAPI.storage.set({ 'remoteBlacklists': filterLists }, onFilterListsReady); }; @@ -564,9 +576,8 @@ µb.purgeCompiledFilterList(path); } // Purge obsolete PSL - if ( metadata.hasOwnProperty(µb.pslPath) === false ) { - entry = metadata[µb.pslPath]; - if ( entry.repoObsolete === true ) { + if ( metadata.hasOwnProperty(µb.pslPath) ) { + if ( metadata[µb.pslPath].repoObsolete === true ) { µb.assets.purge('cache://compiled-publicsuffixlist'); } }