Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add matched cosmetic filters in troubleshooting information
- Loading branch information
Showing
4 changed files
with
171 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
/******************************************************************************* | ||
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'; | ||
|
||
/******************************************************************************/ | ||
|
||
(( ) => { | ||
// >>>>>>>> start of private namespace | ||
|
||
/******************************************************************************/ | ||
|
||
if ( typeof vAPI !== 'object' ) { return; } | ||
if ( typeof vAPI.domFilterer !== 'object' ) { return; } | ||
|
||
/******************************************************************************/ | ||
|
||
const rePseudoElements = /:(?::?after|:?before|:[a-z-]+)$/; | ||
|
||
const hasSelector = selector => { | ||
try { | ||
return document.querySelector(selector) !== null; | ||
} | ||
catch(ex) { | ||
} | ||
return false; | ||
}; | ||
|
||
const safeQuerySelector = selector => { | ||
const safeSelector = rePseudoElements.test(selector) | ||
? selector.replace(rePseudoElements, '') | ||
: selector; | ||
try { | ||
return document.querySelector(safeSelector); | ||
} | ||
catch(ex) { | ||
} | ||
return null; | ||
}; | ||
|
||
const safeGroupSelectors = selectors => { | ||
const arr = Array.isArray(selectors) | ||
? selectors | ||
: Array.from(selectors); | ||
return arr.map(s => { | ||
return rePseudoElements.test(s) | ||
? s.replace(rePseudoElements, '') | ||
: s; | ||
}).join(',\n'); | ||
}; | ||
|
||
const allSelectors = vAPI.domFilterer.getAllSelectors(); | ||
const matchedSelectors = []; | ||
|
||
if ( Array.isArray(allSelectors.declarative) ) { | ||
const declarativeSet = new Set(); | ||
for ( const block of allSelectors.declarative ) { | ||
for ( const selector of block.split(',\n') ) { | ||
declarativeSet.add(selector); | ||
} | ||
} | ||
if ( hasSelector(safeGroupSelectors(declarativeSet)) ) { | ||
for ( const selector of declarativeSet ) { | ||
if ( safeQuerySelector(selector) === null ) { continue; } | ||
matchedSelectors.push(`##${selector}`); | ||
} | ||
} | ||
} | ||
|
||
if ( | ||
Array.isArray(allSelectors.procedural) && | ||
allSelectors.procedural.length !== 0 | ||
) { | ||
for ( const pselector of allSelectors.procedural ) { | ||
if ( pselector.hit === false && pselector.exec().length === 0 ) { continue; } | ||
matchedSelectors.push(`##${pselector.raw}`); | ||
} | ||
} | ||
|
||
if ( Array.isArray(allSelectors.exceptions) ) { | ||
const exceptionDict = new Map(); | ||
for ( const selector of allSelectors.exceptions ) { | ||
if ( selector.charCodeAt(0) !== 0x7B /* '{' */ ) { | ||
exceptionDict.set(selector, selector); | ||
continue; | ||
} | ||
const details = JSON.parse(selector); | ||
if ( | ||
details.action !== undefined && | ||
details.tasks === undefined && | ||
details.action[0] === 'style' | ||
) { | ||
exceptionDict.set(details.selector, details.raw); | ||
continue; | ||
} | ||
const pselector = vAPI.domFilterer.createProceduralFilter(details); | ||
if ( pselector.test() === false ) { continue; } | ||
matchedSelectors.push(`#@#${pselector.raw}`); | ||
} | ||
if ( | ||
exceptionDict.size !== 0 && | ||
hasSelector(safeGroupSelectors(exceptionDict.keys())) | ||
) { | ||
for ( const [ selector, raw ] of exceptionDict ) { | ||
if ( safeQuerySelector(selector) === null ) { continue; } | ||
matchedSelectors.push(`#@#${raw}`); | ||
} | ||
} | ||
} | ||
|
||
if ( matchedSelectors.length === 0 ) { return; } | ||
|
||
return matchedSelectors; | ||
|
||
/******************************************************************************/ | ||
|
||
// <<<<<<<< end of private namespace | ||
})(); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reporting dialog does not open on this page:
https://florydziak.pl/uncategorized/10-kwietnia-juz-oficjalnie-ale/
when Fanboy's Annoyance list is enabled. Firefox Nightly,or my dirty profile onlybeta too, works fine in Chrome. No errors afaict. This commit seems related.6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dozens of tabs with report dialog opened as soon as I closed the tab with this page. No cosmetic filtering info in any of them.
6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes I reproduce such issue on my side too, there is an issue in Firefox where the promise returned by
tabs.executeScript
never resolve. In my case JS was disabled on the site and enabling it fixed the issue, though this should not interfere with content scripts. Need to investigate more.6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems related to using
matchAboutBlank
.Using
runAt: 'document_start'
seems to solve the issue, I will publish a new dev build and will see.6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I could reproduce the issue at
https://florydziak.pl/uncategorized/10-kwietnia-juz-oficjalnie-ale/
, now I can't.On my side I was having the issue at
https://www.businessinsider.com/charlie-javice-frank-criminal-charges-financial-fraud-jpmorgan-chase-2023-1
with JS disabled, now it works.So issue fixed?
6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, it works now. Worth to note that "matched" means "right now" - logger reports more filters.
Disqus adblock detector
These starting with
.ad
are logged on my side.6efd8eb
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, it won't detect bait elements etc., but still useful for cases like https://www.reddit.com/r/uBlockOrigin/comments/12b3eik/, there was a lot of back and forth and it can get very difficult when we have to ask non technical users to find which cosmetic filter interfere negatively. It's why I implemented this, to save time for those cases.