mailto- und tel-Links öffnen jetzt auch aus dem Web-Reader - #280
Merged
Merged
Conversation
The frame's sandbox (allow-same-origin allow-scripts) has neither allow-popups nor an allow-top-navigation-* flag, so its own attempt at a mailto:/tel: link was silently discarded by Chrome: "Navigation to external protocol blocked by sandbox". readerClickAction already routed these through onNavigate correctly; only the frame's own click was ever going to fail. handleClick now cancels the click for 'let-through' too and opens the resolved address from the parent window instead, which carries no sandbox. The iframe's sandbox attribute is unchanged. Closes #274
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Worum es geht: In der Web-Version läuft der Artikel in einem abgeschotteten iframe (
sandbox="allow-same-origin allow-scripts", #269). Ein Klick auf eine E-Mail-Adresse oder Telefonnummer im Artikeltext hat dort bislang nichts ausgelöst: Der Browser hat den Navigationsversuch des abgeschotteten Frames still verworfen, ohne Fehlermeldung für die Leserin. Auf dem Handy funktioniert das seit jeher, weil dort die native WebView den Aufruf selbst an das Betriebssystem weiterreicht.Was sich ändert: Der Klick-Handler des Web-Readers fängt den Klick weiterhin ab und entscheidet wie bisher über
readerClickAction(). Fürmailto:undtel:öffnet er die Adresse jetzt aber aus dem Eltern-Fenster der App statt sie dem Frame zu überlassen, denn das Eltern-Fenster unterliegt keiner Sandbox. Am iframe selbst ändert sich nichts:sandbox="allow-same-origin allow-scripts"bleibt exakt wie zuvor, es kommt wederallow-popupsnoch einallow-top-navigation-*hinzu.Closes #274
Technische Details
Gemessen: Google Chrome 153.0.8010.47 über
playwright-core(Version 1.63.0), headless, aus einem Scratch-Verzeichnis heraus (/usr/bin/google-chrome). Zwei Schritte:sandbox, identischeREADER_CSP, identische Klick-Logik ausreaderClickAction) mit einemmailto:- und einemtel:-Link. Vor der Änderung: Chrome loggtNavigation to external protocol blocked by sandbox, because it doesn't contain any of: 'allow-top-navigation-to-custom-protocols', 'allow-top-navigation-by-user-activation', 'allow-top-navigation', or 'allow-popups'.CDP (
Page.frameRequestedNavigation) zeigt den Navigationsversuch im SANDBOXED Frame, kein Popup, keine Top-Level-Navigation, nichts öffnet sich.window.location.hrefim Eltern-Fenster setzen): keine Sandbox-Fehlermeldung mehr, Chrome loggt stattdessenLaunched external handler for 'mailto:redaktion@correctiv.org'., und CDP zeigt die Navigation jetzt im TOP-Frame, nicht mehr im Sandbox-Frame.Zusätzlich am echten Build verifiziert:
npm run build:web,/gallery-Route (apps/mobile/src/gallery/catalogue.tsx) mit einem temporär eingefügtenmailto:-Link und einemonNavigate, das wie die echteartikel.tsxmailto/tel durchlässt. DieselbeLaunched external handler-Meldung, derselbe reale, kompilierteReaderView.web.tsx-Code. Die Teständerungen angallery/catalogue.tsxundgallery/fixtures.tswurden vor dem Commit wieder verworfen (git checkout), sie sind nicht Teil dieses PRs.Warum die Sandbox unangetastet bleibt: Chromes eigene Fehlermeldung nennt
allow-top-navigation-to-custom-protocolsals Lösung für genau diesen Fall. Trotzdem nicht verwendet, weil ein Sandbox-Flag an jeden im Frame verschachtelten Frame vererbt wird (ADR 0065 §4/§5). Das Flag hier zu setzen würde es auch jedem Embed geben, genau die Reichweite, dieallowsFrameLoad()einem Embed auf dem Handy verweigert.allow-popupsist noch weiter gefasst, ein Dauer-Recht, überhaupt ein Fenster zu öffnen. Stattdessen übernimmt jetzt das Eltern-Fenster das Öffnen, das von Haus aus keiner Sandbox unterliegt, keine neue Berechtigung, nur ein anderer Ort für denselben Aufruf.Geänderte Dateien:
apps/mobile/src/components/reader/ReaderView.web.tsx:handleClickbricht den Klick bei'let-through'jetzt ebenfalls ab und setztwindow.location.hrefim Eltern-Fenster auf die aufgelöste Adresse.apps/mobile/src/lib/articles/readerNavigation.ts: neue FunktionresolveReaderLink(), dieselbe URL-Auflösung, diereaderClickAction()intern schon macht, jetzt auch für den Host verfügbar, damit die Auflösung nicht zweimal geschrieben wird. Die reine Entscheidungslogik inreaderClickAction()selbst ist unverändert.apps/mobile/__tests__/reader-navigation.test.ts: Tests fürresolveReaderLink().Was unverändert bleibt und warum:
classifyReaderLink(),allowsFrameLoad()und die nativeReaderView.tsx(WebView, kein Klick-Handler) sind nicht betroffen, das Problem ist Web-spezifisch, auf dem Handy hat es nie bestanden.readerClickAction()s Signatur und Rückgabewerte ('prevent' | 'let-through') bleiben unverändert, damit bestehende Aufrufer nicht anfassen mussten.Geprüft:
npm run check(Typecheck, oxlint, oxfmt, alle Tests) lokal grün, ebenso über den Push-Hook. Keine sichtbare UI-Änderung, daher kein Screenshot inscreens/evidence/.Nicht geprüft: Ein echter Mailclient/Telefon-Handler auf diesem Linux-Testrechner (Chrome loggt
Launched external handlerfürmailto:, fürtel:ohne registrierten Handler auf der Maschine keine entsprechende Zeile, aber auch keine Sandbox-Fehlermeldung, beides läuft über denselben, jetzt ungehinderten Weg). Firefox 155.0 ist auf dieser Maschine zwar installiert, aberplaywright-coresteuert nur seinen eigenen, gepatchten Firefox-Build an; ein Versuch, den System-Firefox darüber zu starten, schlägt fehl (Failed to launch the browser process), daher kein Firefox-Test.🤖 Generated with Claude Code