Add matched cosmetic filters in troubleshooting information

This commit is contained in:
Raymond Hill 2023-04-04 11:15:44 -04:00
parent 09265ef57c
commit 6efd8eb84a
No known key found for this signature in database
GPG Key ID: 25E1490B761470C2
4 changed files with 171 additions and 13 deletions

View File

@ -609,6 +609,31 @@ const onMessage = function(request, sender, callback) {
}); });
return; return;
case 'launchReporter': {
const pageStore = µb.pageStoreFromTabId(request.tabId);
if ( pageStore === null ) { break; }
if ( vAPI.net.hasUnprocessedRequest(request.tabId) ) {
request.popupPanel.hasUnprocessedRequest = true;
}
const supportURL = new URL(vAPI.getURL('support.html'));
supportURL.searchParams.set('pageURL', request.pageURL);
supportURL.searchParams.set('popupPanel', JSON.stringify(request.popupPanel));
vAPI.tabs.executeScript(request.tabId, {
allFrames: true,
file: '/js/scriptlets/cosmetic-report.js',
matchAboutBlank: true,
}).then(results => {
const filters = results.reduce((a, v) => {
if ( Array.isArray(v) ) { a.push(...v); }
return a;
}, []);
if ( filters.length !== 0 ) {
supportURL.searchParams.set('cosmetic', JSON.stringify(filters));
}
µb.openNewTab({ url: supportURL.href, select: true, index: -1 });
});
return;
}
default: default:
break; break;
} }
@ -623,18 +648,6 @@ const onMessage = function(request, sender, callback) {
response = lastModified !== request.contentLastModified; response = lastModified !== request.contentLastModified;
break; break;
} }
case 'launchReporter': {
const pageStore = µb.pageStoreFromTabId(request.tabId);
if ( pageStore === null ) { break; }
if ( vAPI.net.hasUnprocessedRequest(request.tabId) ) {
request.popupPanel.hasUnprocessedRequest = true;
}
const supportURL = new URL(vAPI.getURL('support.html'));
supportURL.searchParams.set('pageURL', request.pageURL);
supportURL.searchParams.set('popupPanel', JSON.stringify(request.popupPanel));
µb.openNewTab({ url: supportURL.href, select: true, index: -1 });
break;
}
case 'revertFirewallRules': case 'revertFirewallRules':
// TODO: use Set() to message around sets of hostnames // TODO: use Set() to message around sets of hostnames
sessionFirewall.copyRules( sessionFirewall.copyRules(

View File

@ -269,7 +269,7 @@ const handlers = {
if ( if (
details.action !== undefined && details.action !== undefined &&
details.tasks === undefined && details.tasks === undefined &&
details.action[0] === ':style' details.action[0] === 'style'
) { ) {
exceptionDict.set(details.selector, details.raw); exceptionDict.set(details.selector, details.raw);
continue; continue;

View File

@ -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
})();

View File

@ -151,6 +151,9 @@ function showData() {
} }
if ( reportedPage !== null ) { if ( reportedPage !== null ) {
shownData.popupPanel = reportedPage.popupPanel; shownData.popupPanel = reportedPage.popupPanel;
if ( reportedPage.cosmeticFilters ) {
shownData.cosmeticFilters = reportedPage.cosmeticFilters;
}
} }
const text = JSON.stringify(shownData, null, 2) const text = JSON.stringify(shownData, null, 2)
.split('\n') .split('\n')
@ -197,9 +200,14 @@ const reportedPage = (( ) => {
select.append(option); select.append(option);
} }
dom.cl.add(dom.body, 'filterIssue'); dom.cl.add(dom.body, 'filterIssue');
let cosmeticFilters;
if ( url.searchParams.has('cosmetic') ) {
cosmeticFilters = JSON.parse(url.searchParams.get('cosmetic'));
}
return { return {
hostname: parsedURL.hostname.replace(/^(m|mobile|www)\./, ''), hostname: parsedURL.hostname.replace(/^(m|mobile|www)\./, ''),
popupPanel: JSON.parse(url.searchParams.get('popupPanel')), popupPanel: JSON.parse(url.searchParams.get('popupPanel')),
cosmeticFilters,
}; };
} catch(ex) { } catch(ex) {
} }