From 085a8cdbcc8acb530ecd2e9b58a68f89f7392102 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 3 Nov 2019 09:38:36 -0500 Subject: [PATCH] Fine tune cosmetic filtering badge-related code Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/756 As per feedback: - https://github.com/uBlockOrigin/uBlock-issues/issues/756#issuecomment-549128106 --- src/js/background.js | 1 - src/js/messaging.js | 5 +- src/js/scriptlets/dom-survey-elements-all.js | 72 -------------------- src/js/scriptlets/dom-survey-elements.js | 46 +------------ 4 files changed, 4 insertions(+), 120 deletions(-) delete mode 100644 src/js/scriptlets/dom-survey-elements-all.js diff --git a/src/js/background.js b/src/js/background.js index 1fd23f5ca..a63a598f6 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -56,7 +56,6 @@ const µBlock = (( ) => { // jshint ignore:line filterAuthorMode: false, loggerPopupType: 'popup', manualUpdateAssetFetchPeriod: 500, - popupCosmeticFilterBadgeSlow: false, popupFontSize: 'unset', requestJournalProcessPeriod: 1000, selfieAfter: 3, diff --git a/src/js/messaging.js b/src/js/messaging.js index 1305e6466..5fc6513a8 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -387,10 +387,7 @@ const onMessage = function(request, sender, callback) { // Async switch ( request.what ) { case 'getHiddenElementCount': - const scriptlet = µb.hiddenSettings.popupCosmeticFilterBadgeSlow - ? 'elements-all' - : 'elements'; - getElementCount(request.tabId, scriptlet).then(count => { + getElementCount(request.tabId, 'elements').then(count => { callback(count); }); return; diff --git a/src/js/scriptlets/dom-survey-elements-all.js b/src/js/scriptlets/dom-survey-elements-all.js deleted file mode 100644 index 51b109d60..000000000 --- a/src/js/scriptlets/dom-survey-elements-all.js +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************* - - uBlock Origin - a browser extension to block requests. - Copyright (C) 2015-present Raymond Hill - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see {http://www.gnu.org/licenses/}. - - Home: https://github.com/gorhill/uBlock -*/ - -'use strict'; - -/******************************************************************************/ - -// https://github.com/uBlockOrigin/uBlock-issues/issues/756 -// Keep in mind CPU usage with large DOM and/or filterset. - -(( ) => { - if ( typeof vAPI !== 'object' ) { return; } - - const t0 = Date.now(); - - if ( vAPI.domSurveyElements instanceof Object === false ) { - vAPI.domSurveyElements = { - busy: false, - hiddenElementCount: Number.NaN, - surveyTime: t0, - }; - } - const surveyResults = vAPI.domSurveyElements; - - if ( surveyResults.busy ) { return; } - surveyResults.busy = true; - - if ( surveyResults.surveyTime < vAPI.domMutationTime ) { - surveyResults.hiddenElementCount = Number.NaN; - } - surveyResults.surveyTime = t0; - - if ( isNaN(surveyResults.hiddenElementCount) ) { - surveyResults.hiddenElementCount = (( ) => { - if ( vAPI.domFilterer instanceof Object === false ) { return 0; } - const details = vAPI.domFilterer.getAllSelectors_(true); - if ( - Array.isArray(details.declarative) === false || - details.declarative.length === 0 - ) { - return 0; - } - return document.querySelectorAll( - details.declarative.map(entry => entry[0]).join(',') - ).length; - })(); - } - - surveyResults.busy = false; - - // IMPORTANT: This is returned to the injector, so this MUST be - // the last statement. - return surveyResults.hiddenElementCount; -})(); diff --git a/src/js/scriptlets/dom-survey-elements.js b/src/js/scriptlets/dom-survey-elements.js index d6bc83471..51b109d60 100644 --- a/src/js/scriptlets/dom-survey-elements.js +++ b/src/js/scriptlets/dom-survey-elements.js @@ -30,7 +30,6 @@ if ( typeof vAPI !== 'object' ) { return; } const t0 = Date.now(); - const tMax = t0 + 100; if ( vAPI.domSurveyElements instanceof Object === false ) { vAPI.domSurveyElements = { @@ -59,48 +58,9 @@ ) { return 0; } - const selectors = details.declarative.map(entry => entry[0]); - const simple = [], complex = []; - for ( const selectorStr of selectors ) { - for ( const selector of selectorStr.split(',\n') ) { - if ( /[ +>~]/.test(selector) ) { - complex.push(selector); - } else { - simple.push(selector); - } - } - } - const simpleStr = simple.join(',\n'); - const complexStr = complex.join(',\n'); - const nodeIter = document.createTreeWalker( - document.body, - NodeFilter.SHOW_ELEMENT - ); - const matched = new Set(); - let node = nodeIter.nextNode(); - for (;;) { - if ( node === null ) { break; } - if ( Date.now() > tMax ) { return -1; } - if ( - (node.offsetParent !== null) || - (simpleStr === '' || node.matches(simpleStr) === false) && - (complexStr === '' || node.closest(complexStr) !== node) - ) { - node = nodeIter.nextNode(); - continue; - } - matched.add(node); - if ( matched.size === 99 ) { break; } - // https://github.com/uBlockOrigin/uBlock-issues/issues/756#issuecomment-549079064 - // Skip descendants when a match is detected. - for (;;) { - node = nodeIter.nextSibling(); - if ( node !== null ) { break; } - node = nodeIter.parentNode(); - if ( node === null ) { break; } - } - } - return matched.size; + return document.querySelectorAll( + details.declarative.map(entry => entry[0]).join(',') + ).length; })(); }