mirror of https://github.com/gorhill/uBlock.git
Bail out when counting hidden elements is too expensive
Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/756 When trying the number of hidden elements as a result of cosmetic filtering for popup panel badge purpose, the code will bail out if this takes too long, and in such case the badge will be set to `?`, meaning the number of hidden elements is undetermined.
This commit is contained in:
parent
d30c0192b3
commit
6d935c8925
|
@ -374,10 +374,11 @@ const getElementCount = async function(tabId, what) {
|
||||||
});
|
});
|
||||||
|
|
||||||
let total = 0;
|
let total = 0;
|
||||||
results.forEach(count => {
|
for ( const count of results ) {
|
||||||
if ( typeof count !== 'number' ) { return; }
|
if ( typeof count !== 'number' ) { continue; }
|
||||||
|
if ( count === -1 ) { return -1; }
|
||||||
total += count;
|
total += count;
|
||||||
});
|
}
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
};
|
};
|
||||||
|
|
|
@ -688,9 +688,15 @@ const renderPopupLazy = (( ) => {
|
||||||
what: 'getHiddenElementCount',
|
what: 'getHiddenElementCount',
|
||||||
tabId: popupData.tabId,
|
tabId: popupData.tabId,
|
||||||
}).then(count => {
|
}).then(count => {
|
||||||
badge.textContent = (count || 0) !== 0
|
let text;
|
||||||
? Math.min(count, 99).toLocaleString()
|
if ( (count || 0) === 0 ) {
|
||||||
: '';
|
text = '';
|
||||||
|
} else if ( count === -1 ) {
|
||||||
|
text = '?';
|
||||||
|
} else {
|
||||||
|
text = Math.min(count, 99).toLocaleString();
|
||||||
|
}
|
||||||
|
badge.textContent = text;
|
||||||
sw.classList.remove('hnSwitchBusy');
|
sw.classList.remove('hnSwitchBusy');
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -30,11 +30,12 @@
|
||||||
if ( typeof vAPI !== 'object' ) { return; }
|
if ( typeof vAPI !== 'object' ) { return; }
|
||||||
|
|
||||||
const t0 = Date.now();
|
const t0 = Date.now();
|
||||||
|
const tMax = t0 + 100;
|
||||||
|
|
||||||
if ( vAPI.domSurveyElements instanceof Object === false ) {
|
if ( vAPI.domSurveyElements instanceof Object === false ) {
|
||||||
vAPI.domSurveyElements = {
|
vAPI.domSurveyElements = {
|
||||||
busy: false,
|
busy: false,
|
||||||
hiddenElementCount: -1,
|
hiddenElementCount: Number.NaN,
|
||||||
surveyTime: t0,
|
surveyTime: t0,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -44,11 +45,11 @@
|
||||||
surveyResults.busy = true;
|
surveyResults.busy = true;
|
||||||
|
|
||||||
if ( surveyResults.surveyTime < vAPI.domMutationTime ) {
|
if ( surveyResults.surveyTime < vAPI.domMutationTime ) {
|
||||||
surveyResults.hiddenElementCount = -1;
|
surveyResults.hiddenElementCount = Number.NaN;
|
||||||
}
|
}
|
||||||
surveyResults.surveyTime = t0;
|
surveyResults.surveyTime = t0;
|
||||||
|
|
||||||
if ( surveyResults.hiddenElementCount === -1 ) {
|
if ( isNaN(surveyResults.hiddenElementCount) ) {
|
||||||
surveyResults.hiddenElementCount = (( ) => {
|
surveyResults.hiddenElementCount = (( ) => {
|
||||||
if ( vAPI.domFilterer instanceof Object === false ) { return 0; }
|
if ( vAPI.domFilterer instanceof Object === false ) { return 0; }
|
||||||
const details = vAPI.domFilterer.getAllSelectors_(true);
|
const details = vAPI.domFilterer.getAllSelectors_(true);
|
||||||
|
@ -90,6 +91,7 @@
|
||||||
candidates.delete(node);
|
candidates.delete(node);
|
||||||
matched.add(node);
|
matched.add(node);
|
||||||
if ( matched.size === 99 ) { break; }
|
if ( matched.size === 99 ) { break; }
|
||||||
|
if ( Date.now() > tMax ) { return -1; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( matched.size < 99 && complexStr !== '') {
|
if ( matched.size < 99 && complexStr !== '') {
|
||||||
|
@ -97,6 +99,7 @@
|
||||||
if ( node.closest(complexStr) !== node ) { continue; }
|
if ( node.closest(complexStr) !== node ) { continue; }
|
||||||
matched.add(node);
|
matched.add(node);
|
||||||
if ( matched.size === 99 ) { break; }
|
if ( matched.size === 99 ) { break; }
|
||||||
|
if ( Date.now() > tMax ) { return -1; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return matched.size;
|
return matched.size;
|
||||||
|
|
Loading…
Reference in New Issue