From 34f3cfe5e72df31bd86a07082c8f195f27a6a061 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 16 Apr 2019 19:01:14 -0400 Subject: [PATCH] =?UTF-8?q?Add=20filterClassHistogram()=20method=20to=20?= =?UTF-8?q?=C2=B5Block.staticNetFilteringEngine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As a development tool for investigation purpose. To use, enter the following at uBO's dev console: µBlock.staticNetFilteringEngine.filterClassHistogram() --- src/js/static-net-filtering.js | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/js/static-net-filtering.js b/src/js/static-net-filtering.js index 50f694b03..2acb48560 100644 --- a/src/js/static-net-filtering.js +++ b/src/js/static-net-filtering.js @@ -2885,6 +2885,52 @@ FilterContainer.prototype.bucketHistogram = function() { /******************************************************************************/ +FilterContainer.prototype.filterClassHistogram = function() { + const filterClassDetails = new Map(); + + for ( let i = 0; i < filterClasses.length; i++ ) { + filterClassDetails.set(i, { name: filterClasses[i].name, count: 0, }); + } + // Artificial classes to report content of tries + filterClassDetails.set(1000, { name: 'FilterPrefix1Trie', count: 0, }); + filterClassDetails.set(1001, { name: 'FilterHnAnchoredTrie', count: 0, }); + + const countFilter = function(f) { + if ( f instanceof Object === false ) { return; } + filterClassDetails.get(f.fid).count += 1; + if ( f.wrapped ) { + countFilter(f.wrapped); + } + }; + + for ( const category of this.categories.values() ) { + for ( const f of category.values() ) { + countFilter(f); + if ( f instanceof FilterBucket ) { + for ( const g of f.filters ) { countFilter(g); } + if ( f.plainPrefix1Trie !== null ) { + filterClassDetails.get(1000).count += f.plainPrefix1Trie.size; + } + if ( f.plainHnAnchoredTrie !== null ) { + filterClassDetails.get(1001).count += f.plainHnAnchoredTrie.size; + } + continue; + } + if ( f instanceof FilterPair ) { + countFilter(f.f1); + countFilter(f.f2); + continue; + } + } + } + const results = Array.from(filterClassDetails.values()).sort((a, b) => { + return b.count - a.count; + }); + console.log(results); +}; + +/******************************************************************************/ + return new FilterContainer(); /******************************************************************************/