mirror of
https://github.com/gorhill/uBlock.git
synced 2024-09-03 01:29:39 +02:00
Add matched cosmetic filters in troubleshooting information
This commit is contained in:
parent
09265ef57c
commit
6efd8eb84a
@ -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(
|
||||||
|
@ -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;
|
||||||
|
137
src/js/scriptlets/cosmetic-report.js
Normal file
137
src/js/scriptlets/cosmetic-report.js
Normal 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
|
||||||
|
})();
|
||||||
|
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user