Neu: Chrome Extensions Checker
This commit is contained in:
288
chrome_extensions_checker/index.html
Normal file
288
chrome_extensions_checker/index.html
Normal file
@ -0,0 +1,288 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Chrome Extensions Checker | PonyWave Tools</title>
|
||||
<meta name="description" content="Analysiere deine Chrome Extensions lokal und sicher.">
|
||||
<meta property="og:title" content="Chrome Extensions Checker | PonyWave Tools">
|
||||
<meta property="og:description" content="Analysiere deine Chrome Extensions lokal und sicher.">
|
||||
<meta property="og:url" content="https://tools.ponywave.de/chrome_extensions_checker">
|
||||
<meta property="og:image" content="https://tools.ponywave.de/favicon.png">
|
||||
<meta property="og:type" content="website">
|
||||
<link rel="icon" href="https://tools.ponywave.de/favicon.png">
|
||||
<script defer src="https://stats.ponywave.de/script" data-website-id="9ef713d2-adb9-4906-9df5-708d8a8b9131" data-tag="chrome_extensions_checker"></script>
|
||||
<style>
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
min-height: 100vh;
|
||||
margin: 0;
|
||||
background: linear-gradient(120deg, #e0e7ff 0%, #f8fafc 100%);
|
||||
font-family: 'Segoe UI', Arial, sans-serif;
|
||||
color: #222;
|
||||
}
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
width: 100%;
|
||||
margin: 40px auto 0 auto;
|
||||
background: #fff;
|
||||
border-radius: 18px;
|
||||
box-shadow: 0 4px 24px rgba(0,0,0,0.08);
|
||||
padding: 2.5em 2em 2em 2em;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
h1 {
|
||||
color: #3b82f6;
|
||||
margin-top: 0;
|
||||
letter-spacing: 1px;
|
||||
font-size: 2.2em;
|
||||
}
|
||||
.hinweis {
|
||||
background: #fef9c3;
|
||||
color: #a16207;
|
||||
border: 1px solid #fde68a;
|
||||
padding: 1.1em 1em;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 1.5em;
|
||||
font-size: 1.08em;
|
||||
}
|
||||
textarea {
|
||||
width: 100%;
|
||||
min-height: 160px;
|
||||
max-height: 320px;
|
||||
font-family: 'Fira Mono', 'Consolas', monospace;
|
||||
font-size: 1em;
|
||||
border: 1.5px solid #cbd5e1;
|
||||
border-radius: 7px;
|
||||
padding: 0.8em;
|
||||
margin-bottom: 1em;
|
||||
background: #f1f5f9;
|
||||
resize: vertical;
|
||||
box-sizing: border-box;
|
||||
transition: border 0.2s;
|
||||
}
|
||||
textarea:focus {
|
||||
border: 1.5px solid #3b82f6;
|
||||
outline: none;
|
||||
background: #fff;
|
||||
}
|
||||
button {
|
||||
background: linear-gradient(90deg, #3b82f6 60%, #6366f1 100%);
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 7px;
|
||||
padding: 0.7em 2.2em;
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 2px 8px rgba(59,130,246,0.08);
|
||||
margin-bottom: 1.5em;
|
||||
transition: background 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
button:hover {
|
||||
background: linear-gradient(90deg, #2563eb 60%, #4f46e5 100%);
|
||||
box-shadow: 0 4px 16px rgba(59,130,246,0.13);
|
||||
}
|
||||
.error {
|
||||
color: #dc2626;
|
||||
margin: 1em 0;
|
||||
font-weight: 500;
|
||||
}
|
||||
.table-wrapper {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
margin-top: 1em;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 2px 8px rgba(59,130,246,0.06);
|
||||
background: #fff;
|
||||
}
|
||||
.row-v2-warning {
|
||||
background: #fee2e2 !important;
|
||||
color: #b91c1c !important;
|
||||
}
|
||||
.row-v2-warning td, .row-v2-warning th {
|
||||
background: #fee2e2 !important;
|
||||
color: #b91c1c !important;
|
||||
}
|
||||
table {
|
||||
min-width: 900px;
|
||||
width: 100%;
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
background: #fff;
|
||||
margin: 0;
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
box-shadow: none;
|
||||
}
|
||||
th, td {
|
||||
padding: 12px 10px;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
th {
|
||||
background: #f1f5f9;
|
||||
color: #2563eb;
|
||||
font-weight: 600;
|
||||
font-size: 1.05em;
|
||||
}
|
||||
tr:last-child td {
|
||||
border-bottom: none;
|
||||
}
|
||||
tr:nth-child(even) td {
|
||||
background: #f8fafc;
|
||||
}
|
||||
td code {
|
||||
background: #f3f4f6;
|
||||
border-radius: 4px;
|
||||
padding: 2px 5px;
|
||||
font-size: 0.98em;
|
||||
}
|
||||
@media (max-width: 900px) {
|
||||
.container { padding: 1em 0.5em; }
|
||||
th, td { font-size: 0.97em; }
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.container { padding: 0.5em 0.1em; }
|
||||
table, thead, tbody, th, td, tr { display: block; }
|
||||
th { position: absolute; left: -9999px; top: -9999px; }
|
||||
tr { margin-bottom: 1.2em; border-radius: 8px; box-shadow: 0 1px 4px #e0e7ff; background: #fff; }
|
||||
td { border: none; position: relative; padding-left: 50%; min-height: 32px; }
|
||||
td:before {
|
||||
position: absolute;
|
||||
left: 12px;
|
||||
top: 12px;
|
||||
width: 45%;
|
||||
white-space: nowrap;
|
||||
font-weight: 600;
|
||||
color: #2563eb;
|
||||
content: attr(data-label);
|
||||
}
|
||||
}
|
||||
.warnung {
|
||||
background: #fee2e2;
|
||||
color: #b91c1c;
|
||||
border: 1.5px solid #fca5a5;
|
||||
padding: 1em 1em;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 1.2em;
|
||||
font-size: 1.08em;
|
||||
font-weight: 500;
|
||||
}
|
||||
footer {
|
||||
text-align: center;
|
||||
padding: 2rem 1rem;
|
||||
margin-top: 2rem;
|
||||
background-color: #fff;
|
||||
border-top: 1px solid #e5e7eb;
|
||||
}
|
||||
footer a {
|
||||
color: #3b82f6;
|
||||
text-decoration: none;
|
||||
}
|
||||
footer a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.heart {
|
||||
color: #b91c1c;
|
||||
animation: heartbeat 1.5s infinite;
|
||||
}
|
||||
@keyframes heartbeat {
|
||||
0%, 100% { transform: scale(1); }
|
||||
50% { transform: scale(1.1); }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Chrome Extensions Checker</h1>
|
||||
<div class="hinweis">
|
||||
<b>Hinweis:</b> Öffne <code>chrome://extensions-internals</code> in Chrome, kopiere das gesamte JSON aus dem Bereich <b>"Extensions State"</b> und füge es unten ein. Es werden nur Informationen zu den Erweiterungen angezeigt.<br>
|
||||
<b>Es werden keine Daten an einen Server gesendet, alles wird lokal im Browser verarbeitet.</b>
|
||||
</div>
|
||||
<div class="warnung">
|
||||
<b>Achtung:</b> Google entfernt am <b>05. August 2025</b> den Support für Manifest v2. Erweiterungen mit Manifest-Version 2 werden ab diesem Datum nicht mehr funktionieren!
|
||||
</div>
|
||||
<textarea id="jsonInput" placeholder="Füge hier dein JSON ein..."></textarea>
|
||||
<button onclick="parseExtensions()">Anzeigen</button>
|
||||
<div id="error" class="error"></div>
|
||||
<div id="output"></div>
|
||||
</div>
|
||||
<footer>
|
||||
<div class="container">
|
||||
<p><a href="https://tools.ponywave.de/">Zurück zur Startseite</a> | © <span id="current-year"></span> Akamaru | Made with <span class="heart">❤️</span> by Claude</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>
|
||||
function parseExtensions() {
|
||||
const input = document.getElementById('jsonInput').value;
|
||||
const output = document.getElementById('output');
|
||||
const error = document.getElementById('error');
|
||||
output.innerHTML = '';
|
||||
error.textContent = '';
|
||||
let data;
|
||||
try {
|
||||
data = JSON.parse(input);
|
||||
} catch (e) {
|
||||
error.textContent = 'Fehler: Das eingegebene JSON ist ungültig!';
|
||||
return;
|
||||
}
|
||||
if (!Array.isArray(data)) {
|
||||
error.textContent = 'Fehler: Das JSON muss ein Array von Extensions sein!';
|
||||
return;
|
||||
}
|
||||
if (data.length === 0) {
|
||||
output.innerHTML = '<i>Keine Erweiterungen gefunden.</i>';
|
||||
return;
|
||||
}
|
||||
// Tabelle bauen
|
||||
let html = '<div class="table-wrapper"><table><thead><tr>' +
|
||||
'<th>Name</th>' +
|
||||
'<th>ID</th>' +
|
||||
'<th>Version</th>' +
|
||||
'<th>Typ</th>' +
|
||||
'<th>Manifest-Version</th>' +
|
||||
'<th>Aktiv?</th>' +
|
||||
'<th>Berechtigungen</th>' +
|
||||
'</tr></thead><tbody>';
|
||||
data.forEach(ext => {
|
||||
const v2warn = (ext.type === 'TYPE_EXTENSION' && ext.manifest_version === 2) ? 'row-v2-warning' : '';
|
||||
html += `<tr class="${v2warn}">` +
|
||||
'<td data-label="Name">' + (ext.name || '-') + '</td>' +
|
||||
'<td data-label="ID"><code>' + (ext.id || '-') + '</code></td>' +
|
||||
'<td data-label="Version">' + (ext.version || '-') + '</td>' +
|
||||
'<td data-label="Typ">' + (ext.type || '-') + '</td>' +
|
||||
'<td data-label="Manifest-Version">' + (ext.manifest_version || '-') + '</td>' +
|
||||
'<td data-label="Aktiv?">' + (Array.isArray(ext.disable_reasons) && ext.disable_reasons.length === 0 ? 'Ja' : 'Nein') + '</td>' +
|
||||
'<td data-label="Berechtigungen">' + getPermissionsSpoiler(ext.permissions) + '</td>' +
|
||||
'</tr>';
|
||||
});
|
||||
html += '</tbody></table></div>';
|
||||
output.innerHTML = html;
|
||||
}
|
||||
function getPermissions(perm) {
|
||||
if (!perm || !perm.active) return '-';
|
||||
let apis = perm.active.api && perm.active.api.length ? 'APIs: ' + perm.active.api.join(', ') : '';
|
||||
let hosts = perm.active.explicit_hosts && perm.active.explicit_hosts.length ? '<br>Hosts: ' + perm.active.explicit_hosts.join(', ') : '';
|
||||
let scripts = perm.active.scriptable_hosts && perm.active.scriptable_hosts.length ? '<br>Skript-Hosts: ' + perm.active.scriptable_hosts.join(', ') : '';
|
||||
let res = [apis, hosts, scripts].filter(Boolean).join('');
|
||||
return res || '-';
|
||||
}
|
||||
function getPermissionsSpoiler(perm) {
|
||||
const perms = getPermissions(perm);
|
||||
if (perms === '-') return '-';
|
||||
return `<details><summary>Berechtigungen anzeigen</summary><div style='margin-top:0.5em;'>${perms}</div></details>`;
|
||||
}
|
||||
// Jahr im Footer setzen
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var y = document.getElementById('current-year');
|
||||
if(y) y.textContent = new Date().getFullYear();
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -233,6 +233,10 @@
|
||||
<h2 class="tool-title">URL Expander</h2>
|
||||
<p class="tool-description">Erweitere gekürzte URLs und prüfe, wohin sie führen, bevor du sie besuchst</p>
|
||||
</a>
|
||||
<a href="https://tools.ponywave.de/chrome_extensions_checker" class="tool-bubble">
|
||||
<h2 class="tool-title">Chrome Extensions Checker</h2>
|
||||
<p class="tool-description">Analysiere deine Chrome Extensions lokal und sicher.</p>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -26,4 +26,5 @@ https://tools.ponywave.de/gronkh_games
|
||||
https://tools.ponywave.de/url_expander
|
||||
https://tools.ponywave.de/minesweeper
|
||||
https://tools.ponywave.de/anime_graph
|
||||
https://tools.ponywave.de/favorites_viewer
|
||||
https://tools.ponywave.de/favorites_viewer
|
||||
https://tools.ponywave.de/chrome_extensions_checker
|
Reference in New Issue
Block a user