feat(compat): Opera GX Workaround, Firefox MV3, lokale Fonts und Icon-Update
- manifest.opera.json mit Service Worker und Content Script fuer Opera GX Speed Dial - src/js/opera/background.js und redirect.js fuer Tab-Uebernahme - manifest.firefox.json auf Manifest V3 migriert mit Gecko-ID - Fonts von Google Fonts API auf lokale WOFF2-Dateien umgestellt (DSGVO) - Extension-Icons aktualisiert - SECURITY.md und DISCLAIMER.md ueberarbeitet
This commit is contained in:
@@ -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
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
(function() {
|
||||
const dashboardUrl = chrome.runtime.getURL("newtab.html");
|
||||
if (window.location.href !== dashboardUrl) {
|
||||
window.location.href = dashboardUrl;
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user