feat(links): vælg hvilken browser et link åbner i
Ønsket var en liste over de installerede browsere. Den findes ikke: en webside kan hverken se, hvilke browsere der er på maskinen — listen er lukket land, fordi den er et fingeraftryk, der ville følge folk rundt på nettet — eller bede systemet om at bruge en bestemt af dem. Det eneste håndtag er de URL-skemaer, browserne selv registrerer: firefox://open-url, googlechrome://, microsoft-edge:. Dem kan man prøve, og man kan ikke spørge, om de findes. Så indstillingen er skrevet som det, den er — et forsøg med et faldback — frem for som et løfte, der ville holde på telefonen og ikke på en Mac. Valget står i localStorage, ikke på kontoen. Samme grund som sidebjælkens bredde: det er en egenskab ved maskinen, man sidder ved. firefox:// virker på telefonen og gør ingenting på Mac'en, så et valg, der fulgte kontoen, ville være forkert det ene af de to steder hver gang. Ét sted i koden frem for ét pr. komponent. Links står i opgavetitler, i beskrivelser, i noter og i indstillingerne, og en regel, der skulle gentages hvert af de steder, ville mangle det ene sted, ingen tænkte på. Kun udadgående links; programmets egne ruter går gennem SvelteKit som før. To ting, målingen rettede undervejs: Det skjulte iframe — den kendte opskrift — bliver blokeret af appens egen Content-Security-Policy, som siger default-src 'self'. Uden e2e-prøven, der fangede CSP-fejlen i konsollen, ville skemaet aldrig være blevet forsøgt i produktion, og indstillingen ville have set ud til at virke, fordi faldbacket åbnede linket alligevel. Nu sættes location i stedet: et ukendt skema afbryder navigationen frem for at forlade siden. Og faldbacket troede sig blokeret hver eneste gang. window.open med noopener returnerer altid null — det står i specifikationen — så kontrollen af, om fanen blev åbnet, faldt altid ud til "blokeret", og den aktuelle fane blev navigeret væk i stedet. Håndtaget er det eneste, der kan kende en blokeret fane fra en åbnet, så det bruges nu, og opener ryddes bagefter. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e931ddc313
commit
5eb689e4c2
@@ -102,6 +102,23 @@ export const en = {
|
||||
'ai.skip': 'No thanks',
|
||||
'ai.applied': 'Done.',
|
||||
'ai.allDone': 'Nothing left to decide on.',
|
||||
// Which browser links open in. See linkopen.js for why this is an attempt and
|
||||
// not a promise: a web page cannot see which browsers exist.
|
||||
'link.title': 'Links',
|
||||
'link.hint':
|
||||
'Which browser a link opens in. There is no way to ask the system which browsers are installed, so the choice is an attempt: if it does not work on this machine, the link opens the usual way. In practice it works on a phone and rarely on a Mac or PC.',
|
||||
'link.opener': 'Open links in',
|
||||
'link.openerDefault': 'The system default',
|
||||
'link.openerSafari': 'Safari',
|
||||
'link.openerChrome': 'Chrome',
|
||||
'link.openerFirefox': 'Firefox',
|
||||
'link.openerEdge': 'Edge',
|
||||
'link.openerCustom': 'My own address …',
|
||||
'link.template': 'Scheme',
|
||||
'link.templateHint':
|
||||
'{url} becomes the address as it is, {encoded} the address as a parameter value, and {stripped} the address without the http in front.',
|
||||
'link.try': 'Try it',
|
||||
'link.tryHint': 'Opens example.dk, so you can see whether it works here.',
|
||||
'beacon.title': 'Counting installations',
|
||||
'beacon.hint': 'Once a day this installation reports that it exists, so the project can see how many people run it. It sends only the two values below — a random id and the version — and nothing else: no IP is stored, no names, no addresses, nothing about what you use it for. On by default, and you can turn it off here.',
|
||||
'beacon.send': 'Send an anonymous daily report',
|
||||
|
||||
Reference in New Issue
Block a user