[mv3] Add access to troubleshooting info in About pane

This commit is contained in:
Raymond Hill 2025-06-24 17:19:49 -04:00
parent 27936f476e
commit 9bcfc8ff1c
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
5 changed files with 138 additions and 107 deletions

View file

@ -140,6 +140,10 @@
<div class="li"><span><a href="https://flagpedia.net/" target="_blank">Flags of the World</a> by <a href="https://www.davidkrmela.com/">David Krmela</a></span></div>
<div class="li"><span><a href="https://codemirror.net/" target="_blank">CodeMirror 6</a> by <a href="https://github.com/marijnh">Marijn Haverbeke</a></span></div>
</div>
<hr>
<details><summary data-i18n="supportS5H"></summary>
<pre style="user-select: all; -webkit-user-select: all;"></pre>
</details>
</div>
</section>
<!-- -------- -->

View file

@ -19,13 +19,14 @@
Home: https://github.com/gorhill/uBlock
*/
import { dom, qs$ } from './dom.js';
import {
localRead,
localRemove,
localWrite,
} from './ext.js';
import { dom } from './dom.js';
import { getTroubleshootingInfo } from './troubleshooting.js';
import { runtime } from './ext.js';
/******************************************************************************/
@ -52,6 +53,10 @@ localRead('dashboard.activePane').then(pane => {
dom.body.dataset.pane = pane;
});
getTroubleshootingInfo().then(config => {
qs$('[data-i18n="supportS5H"] + pre').textContent = config;
});
/******************************************************************************/
export function hashFromIterable(iter) {

View file

@ -19,18 +19,9 @@
Home: https://github.com/gorhill/uBlock
*/
import {
dom,
qs$,
} from './dom.js';
import {
localRead,
runtime,
sendMessage,
} from './ext.js';
import { dnr } from './ext-compat.js';
import { dom, qs$ } from './dom.js';
import { getTroubleshootingInfo } from './troubleshooting.js';
import { sendMessage } from './ext.js';
/******************************************************************************/
@ -74,98 +65,6 @@ function reportSpecificFilterType() {
/******************************************************************************/
function renderData(data, depth = 0) {
const indent = ' '.repeat(depth);
if ( Array.isArray(data) ) {
const out = [];
for ( const value of data ) {
out.push(renderData(value, depth));
}
return out.join('\n');
}
if ( typeof data !== 'object' || data === null ) {
return `${indent}${data}`;
}
const out = [];
for ( const [ name, value ] of Object.entries(data) ) {
if ( typeof value === 'object' && value !== null ) {
out.push(`${indent}${name}:`);
out.push(renderData(value, depth + 1));
continue;
}
out.push(`${indent}${name}: ${value}`);
}
return out.join('\n');
}
/******************************************************************************/
async function getConfigData() {
const manifest = runtime.getManifest();
const [
platformInfo,
rulesets,
defaultMode,
userRules,
registerContentScriptsReason,
unregisterContentScriptsReason,
] = await Promise.all([
runtime.getPlatformInfo(),
dnr.getEnabledRulesets(),
sendMessage({ what: 'getDefaultFilteringMode' }),
sendMessage({ what: 'getEffectiveUserRules' }),
localRead('$scripting.registerContentScripts'),
localRead('$scripting.unregisterContentScripts'),
]);
const browser = (( ) => {
const extURL = runtime.getURL('');
let agent = '';
if ( extURL.startsWith('moz-extension:') ) {
agent = 'Firefox';
} else if ( extURL.startsWith('safari-web-extension:') ) {
agent = 'Safari';
} else if ( /\bEdg\/\b/.test(navigator.userAgent) ) {
agent = 'Edge';
} else {
agent = 'Chrome';
}
dom.cl.add('html', agent.toLowerCase());
if ( /\bMobile\b/.test(navigator.userAgent) ) {
agent += ' Mobile';
}
const reVersion = new RegExp(`\\b${agent.slice(0,3)}[^/]*/(\\d+)`);
const match = reVersion.exec(navigator.userAgent);
if ( match ) {
agent += ` ${match[1]}`;
}
agent += ` (${platformInfo.os})`
return agent;
})();
const modes = [ 'no filtering', 'basic', 'optimal', 'complete' ];
const config = {
name: manifest.name,
version: manifest.version,
browser,
filtering: {
'site': `${modes[reportedPage.mode]}`,
'default': `${modes[defaultMode]}`,
},
};
if ( userRules.length !== 0 ) {
config['user rules'] = userRules.length;
}
config.rulesets = rulesets;
if ( registerContentScriptsReason !== undefined ) {
config.registerContentScripts = registerContentScriptsReason;
}
if ( unregisterContentScriptsReason !== undefined ) {
config.unregisterContentScripts = unregisterContentScriptsReason;
}
return renderData(config);
}
/******************************************************************************/
async function reportSpecificFilterIssue() {
const githubURL = new URL(
'https://github.com/uBlockOrigin/uAssets/issues/new?template=specific_report_from_ubol.yml'
@ -194,7 +93,7 @@ async function reportSpecificFilterIssue() {
/******************************************************************************/
getConfigData().then(config => {
getTroubleshootingInfo(reportedPage.mode).then(config => {
qs$('[data-i18n="supportS5H"] + pre').textContent = config;
dom.on('[data-url]', 'click', ev => {

View file

@ -0,0 +1,123 @@
/*******************************************************************************
uBlock Origin - a comprehensive, efficient content blocker
Copyright (C) 2024-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
*/
import {
localRead,
runtime,
sendMessage,
} from './ext.js';
import { dnr } from './ext-compat.js';
import { dom } from './dom.js';
/******************************************************************************/
function renderData(data, depth = 0) {
const indent = ' '.repeat(depth);
if ( Array.isArray(data) ) {
const out = [];
for ( const value of data ) {
out.push(renderData(value, depth));
}
return out.join('\n');
}
if ( typeof data !== 'object' || data === null ) {
return `${indent}${data}`;
}
const out = [];
for ( const [ name, value ] of Object.entries(data) ) {
if ( typeof value === 'object' && value !== null ) {
out.push(`${indent}${name}:`);
out.push(renderData(value, depth + 1));
continue;
}
out.push(`${indent}${name}: ${value}`);
}
return out.join('\n');
}
/******************************************************************************/
export async function getTroubleshootingInfo(siteMode) {
const manifest = runtime.getManifest();
const [
platformInfo,
rulesets,
defaultMode,
userRules,
registerContentScriptsReason,
unregisterContentScriptsReason,
] = await Promise.all([
runtime.getPlatformInfo(),
dnr.getEnabledRulesets(),
sendMessage({ what: 'getDefaultFilteringMode' }),
sendMessage({ what: 'getEffectiveUserRules' }),
localRead('$scripting.registerContentScripts'),
localRead('$scripting.unregisterContentScripts'),
]);
const browser = (( ) => {
const extURL = runtime.getURL('');
let agent = '';
if ( extURL.startsWith('moz-extension:') ) {
agent = 'Firefox';
} else if ( extURL.startsWith('safari-web-extension:') ) {
agent = 'Safari';
} else if ( /\bEdg\/\b/.test(navigator.userAgent) ) {
agent = 'Edge';
} else {
agent = 'Chrome';
}
dom.cl.add('html', agent.toLowerCase());
if ( /\bMobile\b/.test(navigator.userAgent) ) {
agent += ' Mobile';
}
const reVersion = new RegExp(`\\b${agent.slice(0,3)}[^/]*/(\\d+)`);
const match = reVersion.exec(navigator.userAgent);
if ( match ) {
agent += ` ${match[1]}`;
}
agent += ` (${platformInfo.os})`
return agent;
})();
const modes = [ 'no filtering', 'basic', 'optimal', 'complete' ];
const filtering = {};
if ( siteMode ) {
filtering.site = `${modes[siteMode]}`
}
filtering.default = `${modes[defaultMode]}`;
const config = {
name: manifest.name,
version: manifest.version,
browser,
filtering,
};
if ( userRules.length !== 0 ) {
config['user rules'] = userRules.length;
}
config.rulesets = rulesets;
if ( registerContentScriptsReason !== undefined ) {
config.registerContentScripts = registerContentScriptsReason;
}
if ( unregisterContentScriptsReason !== undefined ) {
config.unregisterContentScripts = unregisterContentScriptsReason;
}
return renderData(config);
}

View file

@ -55,7 +55,7 @@
<div>
<hr>
<details><summary data-i18n="supportS5H"></summary>
<pre style="user-select: all;"></pre>
<pre style="user-select: all; -webkit-user-select: all;"></pre>
</details>
</div>