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:
parent
c68ff1487a
commit
051cc685ce
@ -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
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user