diff options
Diffstat (limited to 'js/3p-filters.js')
-rw-r--r-- | js/3p-filters.js | 109 |
1 files changed, 80 insertions, 29 deletions
diff --git a/js/3p-filters.js b/js/3p-filters.js index ac18763..cb3da21 100644 --- a/js/3p-filters.js +++ b/js/3p-filters.js @@ -31,6 +31,7 @@ var userListName = chrome.i18n.getMessage('1pPageName'); var listDetails = {}; var externalLists = ''; var cacheWasPurged = false; +var needUpdate = false; /******************************************************************************/ @@ -40,7 +41,6 @@ var onMessage = function(msg) { switch ( msg.what ) { case 'loadUbiquitousBlacklistCompleted': renderBlacklists(); - selectedBlacklistsChanged(); break; default: @@ -109,6 +109,8 @@ var renderBlacklists = function() { var listStatsTemplate = chrome.i18n.getMessage('3pListsOfBlockedHostsPerListStats'); var purgeButtontext = chrome.i18n.getMessage('3pExternalListPurge'); + var updateButtontext = chrome.i18n.getMessage('3pExternalListNew'); + var obsoleteButtontext = chrome.i18n.getMessage('3pExternalListObsolete'); var htmlFromBranch = function(groupKey, listKeys, lists) { var html = [ @@ -134,7 +136,7 @@ var renderBlacklists = function() { listStatsTemplate, '</span>' ].join(''); - var listKey, list, listEntry; + var listKey, list, listEntry, entryDetails; for ( var i = 0; i < listKeys.length; i++ ) { listKey = listKeys[i]; list = lists[listKey]; @@ -146,12 +148,27 @@ var renderBlacklists = function() { .replace('{{total}}', !isNaN(+list.entryCount) ? renderNumber(list.entryCount) : '?'); html.push(listEntry); // https://github.com/gorhill/uBlock/issues/104 - if ( /^https?:\/\/.+/.test(listKey) && listDetails.cache[listKey] ) { + entryDetails = listDetails.cache[listKey]; + if ( entryDetails === undefined ) { + continue; + } + // Update status + if ( !list.off && (entryDetails.repoObsolete || entryDetails.cacheObsolete) ) { + html.push( + ' ', + '<span class="status obsolete">', + entryDetails.repoObsolete ? updateButtontext : obsoleteButtontext, + '</span>' + ); + needUpdate = true; + } + // In cache + else if ( entryDetails.cached ) { html.push( ' ', - '<button type="button" class="purge">', + '<span class="status purge">', purgeButtontext, - '</button>' + '</span>' ); } } @@ -159,6 +176,8 @@ var renderBlacklists = function() { return html.join(''); }; + // https://www.youtube.com/watch?v=unCVi4hYRlY#t=30m18s + var groupsFromLists = function(lists) { var groups = {}; var listKeys = Object.keys(lists); @@ -178,6 +197,7 @@ var renderBlacklists = function() { var onListsReceived = function(details) { listDetails = details; + needUpdate = false; var lists = details.available; var html = []; @@ -208,13 +228,10 @@ var renderBlacklists = function() { uDom('#lists .listDetails').remove(); uDom('#lists').html(html.join('')); - uDom('#parseAllABPHideFilters').prop('checked', listDetails.cosmetic === true); - uDom('#ubiquitousParseAllABPHideFiltersPrompt2').text( - chrome.i18n.getMessage("listsParseAllABPHideFiltersPrompt2") - .replace('{{abpHideFilterCount}}', renderNumber(µb.abpHideFilters.getFilterCount())) - ); + uDom('#autoUpdate').prop('checked', listDetails.autoUpdate === true); + uDom('#parseCosmeticFilters').prop('checked', listDetails.cosmetic === true); uDom('a').attr('target', '_blank'); - selectedBlacklistsChanged(); + updateApplyButtons(); }; messaging.ask({ what: 'getLists' }, onListsReceived); @@ -222,9 +239,9 @@ var renderBlacklists = function() { /******************************************************************************/ -// Check whether lists need reloading. +// Return whether selection of lists changed. -var needToReload = function() { +var listsSelectionChanged = function() { if ( listDetails.cosmetic !== getµb().userSettings.parseAllABPHideFilters ) { return true; } @@ -261,10 +278,19 @@ var needToReload = function() { /******************************************************************************/ +// Return whether content need update. + +var listsContentChanged = function() { + return needUpdate; +}; + +/******************************************************************************/ + // This is to give a visual hint that the selection of blacklists has changed. -var selectedBlacklistsChanged = function() { - uDom('#blacklistsApply').prop('disabled', !needToReload()); +var updateApplyButtons = function() { + uDom('#buttonApply').toggleClass('enabled', listsSelectionChanged()); + uDom('#buttonUpdate').toggleClass('enabled', listsContentChanged()); }; /******************************************************************************/ @@ -278,7 +304,7 @@ var onListCheckboxChanged = function() { return; } listDetails.available[href].off = !this.checked; - selectedBlacklistsChanged(); + updateApplyButtons(); }; /******************************************************************************/ @@ -295,22 +321,22 @@ var onListLinkClicked = function(ev) { var onPurgeClicked = function(ev) { var button = uDom(this); - var href = button.parent().find('a').first().attr('href'); + var li = button.parent(); + var href = li.find('a').first().attr('href'); if ( !href ) { return; } messaging.tell({ what: 'purgeCache', path: href }); button.remove(); - cacheWasPurged = true; - selectedBlacklistsChanged(); + if ( li.find('input').first().prop('checked') ) { + cacheWasPurged = true; + updateApplyButtons(); + } }; /******************************************************************************/ -var blacklistsApplyHandler = function() { - if ( !needToReload() ) { - return; - } +var reloadAll = function(update) { // Reload blacklists messaging.tell({ what: 'userSettings', @@ -334,17 +360,40 @@ var blacklistsApplyHandler = function() { } messaging.tell({ what: 'reloadAllFilters', - switches: switches + switches: switches, + update: update }); cacheWasPurged = false; - uDom('#blacklistsApply').prop('disabled', true); +}; + +/******************************************************************************/ + +var buttonApplyHandler = function() { + reloadAll(); + uDom('#buttonApply').toggleClass('enabled', false); +}; + +/******************************************************************************/ + +var buttonUpdateHandler = function() { + reloadAll(true); +}; + +/******************************************************************************/ + +var autoUpdateCheckboxChanged = function() { + messaging.tell({ + what: 'userSettings', + name: 'autoUpdate', + value: this.checked + }); }; /******************************************************************************/ var abpHideFiltersCheckboxChanged = function() { listDetails.cosmetic = this.checked; - selectedBlacklistsChanged(); + updateApplyButtons(); }; /******************************************************************************/ @@ -383,11 +432,13 @@ var externalListsApplyHandler = function() { uDom.onLoad(function() { // Handle user interaction - uDom('#parseAllABPHideFilters').on('change', abpHideFiltersCheckboxChanged); - uDom('#blacklistsApply').on('click', blacklistsApplyHandler); + uDom('#autoUpdate').on('change', autoUpdateCheckboxChanged); + uDom('#parseCosmeticFilters').on('change', abpHideFiltersCheckboxChanged); + uDom('#buttonApply').on('click', buttonApplyHandler); + uDom('#buttonUpdate').on('click', buttonUpdateHandler); uDom('#lists').on('change', '.listDetails > input', onListCheckboxChanged); uDom('#lists').on('click', '.listDetails > a:nth-of-type(1)', onListLinkClicked); - uDom('#lists').on('click', 'button.purge', onPurgeClicked); + uDom('#lists').on('click', 'span.purge', onPurgeClicked); uDom('#externalLists').on('input', externalListsChangeHandler); uDom('#externalListsApply').on('click', externalListsApplyHandler); |