diff --git a/.gitignore b/.gitignore index 7d5abd0..d078993 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ .DS_Store Thumbs.db desktop.ini - +CLAUDE.md # Editor .vscode/ .idea/ @@ -14,6 +14,7 @@ dist/ *.zip *.tar.gz node_modules/ +/xpi/ # Persönliche Backup-Dateien (nicht ins Repo) favorites_*.html diff --git a/DISCLAIMER.md b/DISCLAIMER.md index ca11a25..538035b 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -44,4 +44,4 @@ Der Entwickler behält sich das Recht vor, diese Extension jederzeit zu ändern, --- -**Hellion NewTab** — [Hellion Online Media](https://hellion-media.de) — JonKazama-Hellion +**Hellion NewTab** — [Hellion Online Media - Florian Wathing](https://hellion-media.de) — JonKazama-Hellion diff --git a/SECURITY.md b/SECURITY.md index 4f9e917..9cf54ca 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -73,4 +73,4 @@ Keine Permissions für: Tabs, History, Web Requests, Downloads, Clipboard oder H --- -**Hellion NewTab** — [Hellion Online Media](https://hellion-media.de) — JonKazama-Hellion +**Hellion Dashboard** — [Hellion Online Media - Florian Wathling](https://hellion-media.de) — JonKazama-Hellion diff --git a/assets/fonts/Cinzel-VariableFont_wght.woff2 b/assets/fonts/Cinzel-VariableFont_wght.woff2 new file mode 100644 index 0000000..042e01c Binary files /dev/null and b/assets/fonts/Cinzel-VariableFont_wght.woff2 differ diff --git a/assets/fonts/Inter-VariableFont_opsz,wght.woff2 b/assets/fonts/Inter-VariableFont_opsz,wght.woff2 new file mode 100644 index 0000000..d97bc11 Binary files /dev/null and b/assets/fonts/Inter-VariableFont_opsz,wght.woff2 differ diff --git a/assets/fonts/Rajdhani-Bold.woff2 b/assets/fonts/Rajdhani-Bold.woff2 new file mode 100644 index 0000000..57abc91 Binary files /dev/null and b/assets/fonts/Rajdhani-Bold.woff2 differ diff --git a/assets/fonts/Rajdhani-Regular.woff2 b/assets/fonts/Rajdhani-Regular.woff2 new file mode 100644 index 0000000..855027c Binary files /dev/null and b/assets/fonts/Rajdhani-Regular.woff2 differ diff --git a/assets/icons/icon128.png b/assets/icons/icon128.png index 0c9d76c..b9c581a 100644 Binary files a/assets/icons/icon128.png and b/assets/icons/icon128.png differ diff --git a/assets/icons/icon16.png b/assets/icons/icon16.png index 427f476..a1cf4c0 100644 Binary files a/assets/icons/icon16.png and b/assets/icons/icon16.png differ diff --git a/assets/icons/icon48.png b/assets/icons/icon48.png index 2081eca..5c82411 100644 Binary files a/assets/icons/icon48.png and b/assets/icons/icon48.png differ diff --git a/manifest.firefox.json b/manifest.firefox.json index 4120f4e..49c5b0e 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,9 +1,9 @@ { "manifest_version": 3, "name": "Hellion NewTab", - "version": "1.2.0", + "version": "1.5.2", "description": "Personal bookmark dashboard — local, private, no account needed. By Hellion Online Media.", - "author": "Florian Wathling – hellion-media.de", + "author": "Hellion Online Media - Florian Wathling", "homepage_url": "https://hellion-media.de", "chrome_url_overrides": { @@ -26,7 +26,12 @@ } } }, - + "web_accessible_resources": [ + { + "resources": ["assets/fonts/*.woff2"], + "matches": [""] + } + ], "icons": { "16": "assets/icons/icon16.png", "48": "assets/icons/icon48.png", diff --git a/manifest.json b/manifest.json index 49426f5..a7624fb 100644 --- a/manifest.json +++ b/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 3, "name": "Hellion NewTab", - "version": "1.2.0", + "version": "1.5.2", "description": "Personal bookmark dashboard — local, private, no account needed. By Hellion Online Media.", - "author": "Florian Wathling – hellion-media.de", + "author": "Hellion Online Media - Florian Wathling", "homepage_url": "https://hellion-media.de", "chrome_url_overrides": { "newtab": "newtab.html" @@ -12,6 +12,12 @@ "storage", "bookmarks" ], +"web_accessible_resources": [ + { + "resources": ["assets/fonts/*.woff2"], + "matches": [""] + } + ], "icons": { "16": "assets/icons/icon16.png", "48": "assets/icons/icon48.png", diff --git a/manifest.opera.json b/manifest.opera.json new file mode 100644 index 0000000..dc4fcfc --- /dev/null +++ b/manifest.opera.json @@ -0,0 +1,47 @@ +{ + "manifest_version": 3, + "name": "Hellion Dashboard (GX Native)", + "version": "1.5.2", + "description": "Ersetzt die Opera GX Startseite durch dein persönliches, leistungsoptimiertes Hellion Dashboard. Schnell, sauber und werbefrei.", + "author": "Hellion Online Media - Florian Wathling", + "homepage_url": "https://hellion-media.de", + + "permissions": [ + "tabs", + "storage", + "bookmarks" + ], + + "background": { + "service_worker": "src/js/opera/background.js" + }, + + "content_scripts": [ + { + "matches": [ + "https://*.opera.com/startpage*", + "http://*.opera.com/startpage*" + ], + "js": ["src/js/opera/redirect.js"], + "run_at": "document_start", + "all_frames": true + } + ], + +"web_accessible_resources": [ + { + "resources": ["assets/fonts/*.woff2"], + "matches": [""] + } + ], + + "action": { + "default_title": "Hellion Dashboard" + }, + + "icons": { + "16": "assets/icons/icon16.png", + "48": "assets/icons/icon48.png", + "128": "assets/icons/icon128.png" + } +} \ No newline at end of file diff --git a/src/js/opera/README.md b/src/js/opera/README.md new file mode 100644 index 0000000..238abc0 --- /dev/null +++ b/src/js/opera/README.md @@ -0,0 +1,47 @@ +# ⬡ Opera GX — New-Tab Workaround + +Opera GX priorisiert die eigene Speed Dial Seite und ignoriert `chrome_url_overrides` +für entpackte Erweiterungen. Um das Hellion Dashboard trotzdem als New-Tab-Seite +zu etablieren, kommen zwei zusätzliche Skripte zum Einsatz. + +--- + +## Warum zwei extra Skripte? + +| Browser | New-Tab Override | Zusatzaufwand | +|---|---|---| +| Chrome / Edge / Brave / Vivaldi | `chrome_url_overrides` | Keiner | +| Firefox | `chrome_url_overrides` (MV2) | Eigenes Manifest | +| Opera / Opera GX | Blockiert durch Speed Dial | Workaround nötig | + +--- + +## Was passiert hier? + +### `background.js` — Tab-Management + +Überwacht Tab-Aktivitäten im Hintergrund und greift ein bevor Opera seine Startseite lädt. + +- Erkennt `opera://startpage/` und `chrome://startpage/` +- Leitet per `chrome.tabs.update` auf `newtab.html` um +- Prüft zusätzlich bei `onActivated` — auch im Hintergrund geladene Tabs werden sofort aktualisiert + +### `redirect.js` — In-Page Redirect + +Einige Opera-Systemprozesse sind so isoliert dass ein externer Eingriff nicht zuverlässig greift. + +- Wird als Content Script in Opera-Startseiten-Bereiche injiziert +- Löst den Redirect bei `document_start` aus — minimale Verzögerung, kein Flackern + +--- + +## Datenschutz + +Kein Tracking, keine Speicherung, keine externen Requests. +Ausschließlich Standard-Browser-APIs — `chrome.tabs` — um die Kontrolle über den New Tab zurückzugewinnen. + +**100% lokal. 0% Analytics. Wie im gesamten Hellion NewTab Projekt.** + +--- + +Entwickelt von **[Hellion Online Media — Florian Wathling](https://hellion-media.de)** — JonKazama-Hellion diff --git a/src/js/opera/background.js b/src/js/opera/background.js new file mode 100644 index 0000000..221b65b --- /dev/null +++ b/src/js/opera/background.js @@ -0,0 +1,34 @@ +const dashboardUrl = chrome.runtime.getURL("newtab.html"); + +// Diese URLs wollen wir abfangen +const targetUrls = [ + "chrome://startpage/", + "opera://startpage/", + "chrome://startpageshared/", + "about:blank" +]; + +function forceRedirect(tabId, url) { + if (url && targetUrls.some(target => url.startsWith(target))) { + chrome.tabs.update(tabId, { url: dashboardUrl }); + } +} + +// 1. Check beim Erstellen +chrome.tabs.onCreated.addListener((tab) => { + forceRedirect(tab.id, tab.pendingUrl || tab.url); +}); + +// 2. Check beim Aktualisieren (Wichtig für Opera GX!) +chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { + if (changeInfo.status === "loading" || changeInfo.url) { + forceRedirect(tabId, tab.url); + } +}); + +// 3. Intervall-Check: Falls Opera den Event verschluckt +chrome.tabs.onActivated.addListener((activeInfo) => { + chrome.tabs.get(activeInfo.tabId, (tab) => { + if (tab) forceRedirect(tab.id, tab.url); + }); +}); \ No newline at end of file diff --git a/src/js/opera/redirect.js b/src/js/opera/redirect.js new file mode 100644 index 0000000..1431017 --- /dev/null +++ b/src/js/opera/redirect.js @@ -0,0 +1,6 @@ +(function() { + const dashboardUrl = chrome.runtime.getURL("newtab.html"); + if (window.location.href !== dashboardUrl) { + window.location.href = dashboardUrl; + } +})(); \ No newline at end of file