1
0
mirror of https://github.com/gorhill/uBlock.git synced 2024-10-06 09:37:12 +02:00

element picker: code review

This commit is contained in:
gorhill 2016-04-17 10:15:01 -04:00
parent c68ff1487a
commit 051cc685ce

View File

@ -269,6 +269,7 @@ var highlightElements = function(elems, force) {
/******************************************************************************/ /******************************************************************************/
var filterElements = function(filter) { var filterElements = function(filter) {
var htmlElem = document.documentElement;
var items = elementsFromFilter(filter); var items = elementsFromFilter(filter);
var i = items.length, item, elem, style; var i = items.length, item, elem, style;
while ( i-- ) { while ( i-- ) {
@ -276,8 +277,9 @@ var filterElements = function(filter) {
elem = item.elem; elem = item.elem;
style = elem.style; style = elem.style;
if ( if (
item.type === 'cosmetic' || (elem !== htmlElem) &&
item.type === 'network' && item.src !== undefined (item.type === 'cosmetic' ||
item.type === 'network' && item.src !== undefined)
) { ) {
previewedElements.push({ previewedElements.push({
elem: elem, elem: elem,
@ -457,6 +459,7 @@ var netFilterFromElement = function(elem) {
if ( bestCandidateFilter === null ) { if ( bestCandidateFilter === null ) {
bestCandidateFilter = { bestCandidateFilter = {
type: 'net',
filters: candidates, filters: candidates,
slot: candidates.length slot: candidates.length
}; };
@ -514,69 +517,64 @@ var cosmeticFilterFromElement = function(elem) {
candidateElements.push(elem); candidateElements.push(elem);
} }
var tagName = elem.tagName.toLowerCase(); var tagName = elem.localName;
var prefix = ''; var selector = '';
var suffix = [];
var v, i; var v, i;
// Id // Id
v = typeof elem.id === 'string' && CSS.escape(elem.id); v = typeof elem.id === 'string' && CSS.escape(elem.id);
if ( v ) { if ( v ) {
suffix.push('#', v); selector = '#' + v;
} }
// Class(es) // Class(es)
if ( suffix.length === 0 ) { if ( selector === '' ) {
v = elem.classList; v = elem.classList;
if ( v ) { if ( v ) {
i = v.length || 0; i = v.length || 0;
while ( i-- ) { while ( i-- ) {
suffix.push('.' + CSS.escape(v.item(i))); selector += '.' + CSS.escape(v.item(i));
} }
} }
} }
// Tag name // Tag name
if ( suffix.length === 0 ) { if ( selector === '' ) {
prefix = tagName; selector = tagName;
} var attributes = [], attr;
switch ( tagName ) {
// Attributes (depends on tag name) case 'a':
var attributes = [], attr; v = elem.getAttribute('href');
switch ( tagName ) { if ( v ) {
case 'a': v = v.replace(/\?.*$/, '');
v = elem.getAttribute('href'); if ( v.length ) {
if ( v ) { attributes.push({ k: 'href', v: v });
v = v.replace(/\?.*$/, ''); }
if ( v.length ) { }
attributes.push({ k: 'href', v: v }); break;
case 'img':
v = elem.getAttribute('alt');
if ( v && v.length !== 0 ) {
attributes.push({ k: 'alt', v: v });
}
break;
default:
break;
}
while ( (attr = attributes.pop()) ) {
if ( attr.v.length === 0 ) {
continue;
}
v = elem.getAttribute(attr.k);
if ( attr.v === v ) {
selector += '[' + attr.k + '="' + attr.v + '"]';
} else if ( v.lastIndexOf(attr.v, 0) === 0 ) {
selector += '[' + attr.k + '^="' + attr.v + '"]';
} else {
selector += '[' + attr.k + '*="' + attr.v + '"]';
} }
} }
break;
case 'img':
v = elem.getAttribute('alt');
if ( v && v.length !== 0 ) {
attributes.push({ k: 'alt', v: v });
}
break;
default:
break;
} }
while ( (attr = attributes.pop()) ) {
if ( attr.v.length === 0 ) {
continue;
}
v = elem.getAttribute(attr.k);
if ( attr.v === v ) {
suffix.push('[', attr.k, '="', attr.v, '"]');
} else if ( v.indexOf(attr.v) === 0 ) {
suffix.push('[', attr.k, '^="', attr.v, '"]');
} else {
suffix.push('[', attr.k, '*="', attr.v, '"]');
}
}
var selector = prefix + suffix.join('');
// https://github.com/chrisaljoudi/uBlock/issues/637 // https://github.com/chrisaljoudi/uBlock/issues/637
// If the selector is still ambiguous at this point, further narrow using // If the selector is still ambiguous at this point, further narrow using
@ -587,10 +585,7 @@ var cosmeticFilterFromElement = function(elem) {
i = 1; i = 1;
while ( elem.previousSibling !== null ) { while ( elem.previousSibling !== null ) {
elem = elem.previousSibling; elem = elem.previousSibling;
if ( typeof elem.tagName !== 'string' ) { if ( typeof elem.localName !== 'string' || elem.localName !== tagName ) {
continue;
}
if ( elem.tagName.toLowerCase() !== tagName ) {
continue; continue;
} }
i++; i++;
@ -600,6 +595,7 @@ var cosmeticFilterFromElement = function(elem) {
if ( bestCandidateFilter === null ) { if ( bestCandidateFilter === null ) {
bestCandidateFilter = { bestCandidateFilter = {
type: 'cosmetic',
filters: cosmeticFilterCandidates, filters: cosmeticFilterCandidates,
slot: cosmeticFilterCandidates.length slot: cosmeticFilterCandidates.length
}; };