mirror of
https://github.com/gorhill/uBlock.git
synced 2024-09-18 08:52:26 +02:00
performance improvement re. high-high generics
This commit is contained in:
parent
19c6155787
commit
af95ef5c1a
@ -247,30 +247,39 @@ var uBlockMessaging = (function(name){
|
|||||||
processHighMediumGenerics(highGenerics.hideMedium, hideSelectors);
|
processHighMediumGenerics(highGenerics.hideMedium, hideSelectors);
|
||||||
}
|
}
|
||||||
if ( highGenerics.hideHighCount ) {
|
if ( highGenerics.hideHighCount ) {
|
||||||
processHighHighGenerics(highGenerics.hideHigh, hideSelectors);
|
processHighHighGenericsAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( hideSelectors.length ) {
|
if ( hideSelectors.length ) {
|
||||||
hideElements(hideSelectors);
|
addStyleTag(hideSelectors);
|
||||||
var style = document.createElement('style');
|
|
||||||
style.setAttribute('class', 'ublock-postload-1ae7a5f130fc79b4fdb8a4272d9426b5');
|
|
||||||
// The linefeed before the style block is very important: do no remove!
|
|
||||||
style.appendChild(document.createTextNode(hideSelectors.join(',\n') + '\n{display:none !important;}'));
|
|
||||||
var parent = document.body || document.documentElement;
|
|
||||||
if ( parent ) {
|
|
||||||
parent.appendChild(style);
|
|
||||||
}
|
|
||||||
messaging.tell({
|
|
||||||
what: 'injectedSelectors',
|
|
||||||
type: 'cosmetic',
|
|
||||||
hostname: window.location.hostname,
|
|
||||||
selectors: hideSelectors
|
|
||||||
});
|
|
||||||
//console.debug('µBlock> generic cosmetic filters: injecting %d CSS rules:', hideSelectors.length, text);
|
|
||||||
}
|
}
|
||||||
contextNodes.length = 0;
|
contextNodes.length = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Ensure elements matching a set of selectors are visually removed
|
||||||
|
// from the page, by:
|
||||||
|
// - Modifying the style property on the elements themselves
|
||||||
|
// - Injecting a style tag
|
||||||
|
|
||||||
|
var addStyleTag = function(selectors) {
|
||||||
|
hideElements(selectors);
|
||||||
|
var style = document.createElement('style');
|
||||||
|
style.setAttribute('class', 'ublock-postload-1ae7a5f130fc79b4fdb8a4272d9426b5');
|
||||||
|
// The linefeed before the style block is very important: do no remove!
|
||||||
|
style.appendChild(document.createTextNode(selectors.join(',\n') + '\n{display:none !important;}'));
|
||||||
|
var parent = document.body || document.documentElement;
|
||||||
|
if ( parent ) {
|
||||||
|
parent.appendChild(style);
|
||||||
|
}
|
||||||
|
messaging.tell({
|
||||||
|
what: 'injectedSelectors',
|
||||||
|
type: 'cosmetic',
|
||||||
|
hostname: window.location.hostname,
|
||||||
|
selectors: selectors
|
||||||
|
});
|
||||||
|
//console.debug('µBlock> generic cosmetic filters: injecting %d CSS rules:', selectors.length, text);
|
||||||
|
};
|
||||||
|
|
||||||
var hideElements = function(selectors) {
|
var hideElements = function(selectors) {
|
||||||
// https://github.com/gorhill/uBlock/issues/207
|
// https://github.com/gorhill/uBlock/issues/207
|
||||||
// Do not call querySelectorAll() using invalid CSS selectors
|
// Do not call querySelectorAll() using invalid CSS selectors
|
||||||
@ -289,6 +298,8 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Extract and return the staged nodes which (may) match the selectors.
|
||||||
|
|
||||||
var selectNodes = function(selector) {
|
var selectNodes = function(selector) {
|
||||||
var targetNodes = [];
|
var targetNodes = [];
|
||||||
var i = contextNodes.length;
|
var i = contextNodes.length;
|
||||||
@ -309,6 +320,10 @@ var uBlockMessaging = (function(name){
|
|||||||
return targetNodes;
|
return targetNodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Low generics:
|
||||||
|
// - [id]
|
||||||
|
// - [class]
|
||||||
|
|
||||||
var processLowGenerics = function(generics, out) {
|
var processLowGenerics = function(generics, out) {
|
||||||
var i = generics.length;
|
var i = generics.length;
|
||||||
var selector;
|
var selector;
|
||||||
@ -322,6 +337,10 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// High-low generics:
|
||||||
|
// - [alt="..."]
|
||||||
|
// - [title="..."]
|
||||||
|
|
||||||
var processHighLowGenerics = function(generics, out) {
|
var processHighLowGenerics = function(generics, out) {
|
||||||
var attrs = ['title', 'alt'];
|
var attrs = ['title', 'alt'];
|
||||||
var attr, attrValue, nodeList, iNode, node;
|
var attr, attrValue, nodeList, iNode, node;
|
||||||
@ -351,6 +370,9 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// High-medium generics:
|
||||||
|
// - [href^="http"]
|
||||||
|
|
||||||
var processHighMediumGenerics = function(generics, out) {
|
var processHighMediumGenerics = function(generics, out) {
|
||||||
var nodeList = selectNodes('a[href^="http"]');
|
var nodeList = selectNodes('a[href^="http"]');
|
||||||
var iNode = nodeList.length;
|
var iNode = nodeList.length;
|
||||||
@ -376,22 +398,45 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var processHighHighGenerics = function(generics, out) {
|
// High-high generics are *very costly* to process, so we will coalesce
|
||||||
|
// requests to process high-high generics into as few requests as possible.
|
||||||
|
// The gain is *significant* on bloated pages.
|
||||||
|
|
||||||
|
var processHighHighGenericsTimer = null;
|
||||||
|
|
||||||
|
var processHighHighGenerics = function() {
|
||||||
|
processHighHighGenericsTimer = null;
|
||||||
if ( injectedSelectors['{{highHighGenerics}}'] !== undefined ) { return; }
|
if ( injectedSelectors['{{highHighGenerics}}'] !== undefined ) { return; }
|
||||||
if ( document.querySelector(generics) === null ) { return; }
|
if ( document.querySelector(highGenerics.hideHigh) === null ) { return; }
|
||||||
injectedSelectors['{{highHighGenerics}}'] = true;
|
injectedSelectors['{{highHighGenerics}}'] = true;
|
||||||
var selectors = generics.split(',\n');
|
// We need to filter out possible exception cosmetic filters from
|
||||||
var iSelector = selectors.length;
|
// high-high generics selectors.
|
||||||
|
var selectors = highGenerics.hideHigh.split(',\n');
|
||||||
|
var i = selectors.length;
|
||||||
var selector;
|
var selector;
|
||||||
while ( iSelector-- ) {
|
while ( i-- ) {
|
||||||
selector = selectors[iSelector];
|
selector = selectors[i];
|
||||||
if ( injectedSelectors[selector] === undefined ) {
|
if ( injectedSelectors.hasOwnProperty(selector) ) {
|
||||||
|
selectors.splice(i, 1);
|
||||||
|
} else {
|
||||||
injectedSelectors[selector] = true;
|
injectedSelectors[selector] = true;
|
||||||
out.push(selector);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ( selectors.length !== 0 ) {
|
||||||
|
addStyleTag(selectors);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var processHighHighGenericsAsync = function() {
|
||||||
|
if ( processHighHighGenericsTimer !== null ) {
|
||||||
|
clearTimeout(processHighHighGenericsTimer);
|
||||||
|
}
|
||||||
|
processHighHighGenericsTimer = setTimeout(processHighHighGenerics, 300);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Extract all ids: these will be passed to the cosmetic filtering
|
||||||
|
// engine, and in return we will obtain only the relevant CSS selectors.
|
||||||
|
|
||||||
var idsFromNodeList = function(nodes) {
|
var idsFromNodeList = function(nodes) {
|
||||||
if ( !nodes || !nodes.length ) {
|
if ( !nodes || !nodes.length ) {
|
||||||
return;
|
return;
|
||||||
@ -418,6 +463,9 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Extract all classes: these will be passed to the cosmetic filtering
|
||||||
|
// engine, and in return we will obtain only the relevant CSS selectors.
|
||||||
|
|
||||||
var classesFromNodeList = function(nodes) {
|
var classesFromNodeList = function(nodes) {
|
||||||
if ( !nodes || !nodes.length ) {
|
if ( !nodes || !nodes.length ) {
|
||||||
return;
|
return;
|
||||||
@ -460,8 +508,14 @@ var uBlockMessaging = (function(name){
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Start cosmetic filtering.
|
||||||
|
|
||||||
domLoaded();
|
domLoaded();
|
||||||
|
|
||||||
|
// Below this point is the code which takes care to observe changes in
|
||||||
|
// the page and to add if needed relevant CSS rules as a result of the
|
||||||
|
// changes.
|
||||||
|
|
||||||
// Observe changes in the DOM only if...
|
// Observe changes in the DOM only if...
|
||||||
// - there is a document.body
|
// - there is a document.body
|
||||||
// - there is at least one `script` tag
|
// - there is at least one `script` tag
|
||||||
|
@ -385,9 +385,10 @@ PageStore.prototype.getNetFilteringSwitch = function() {
|
|||||||
PageStore.prototype.filterRequest = function(context, requestType, requestURL) {
|
PageStore.prototype.filterRequest = function(context, requestType, requestURL) {
|
||||||
var result = this.netFilteringCache.lookup(requestURL);
|
var result = this.netFilteringCache.lookup(requestURL);
|
||||||
if ( result !== undefined ) {
|
if ( result !== undefined ) {
|
||||||
|
//console.debug(' cache HIT: PageStore.filterRequest("%s")', requestURL);
|
||||||
return result.slice(result.indexOf('\t') + 1);
|
return result.slice(result.indexOf('\t') + 1);
|
||||||
}
|
}
|
||||||
//console.debug('µBlock> PageStore.filterRequest(): "%s" not in cache', requestURL);
|
//console.debug('cache MISS: PageStore.filterRequest("%s")', requestURL);
|
||||||
result = µb.netFilteringEngine.matchString(context, requestURL, requestType);
|
result = µb.netFilteringEngine.matchString(context, requestURL, requestType);
|
||||||
if ( collapsibleRequestTypes.indexOf(requestType) !== -1 || µb.userSettings.logRequests ) {
|
if ( collapsibleRequestTypes.indexOf(requestType) !== -1 || µb.userSettings.logRequests ) {
|
||||||
this.netFilteringCache.add(requestURL, requestType + '\t' + result);
|
this.netFilteringCache.add(requestURL, requestType + '\t' + result);
|
||||||
|
Loading…
Reference in New Issue
Block a user