1
0

Neu: Chrome Extensions Checker

This commit is contained in:
Akamaru
2025-07-06 20:39:18 +02:00
parent a00a70c11a
commit 07cf1daab9
3 changed files with 294 additions and 1 deletions

View 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> | &copy; <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>

View File

@ -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>

View File

@ -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