2016-02-29 15 views
10

Sto creando un gestore di protocollo personalizzato per Google Chrome su Linux. Il mio legame si presenta così:Perché Chrome su Linux mostra la finestra di dialogo "Richiesta protocollo esterno" per protocollo sconosciuto?

<a href="myprotocol:someargument">Trigger my app with param</a> 

ho notato che se 'myprotocol:' non è registrato (la mia app non installato), Google Chrome su Linux mostra "Richiesta protocollo esterno" finestra e cerca di utilizzare xdg-open :

enter image description here

Mentre su altri sistemi operativi, come Windows 10 e OS X El Capitan nulla viene visualizzato se il protocollo non è registrato.

Ho anche verificato che Firefox funzioni in modo coerente per protocolli sconosciuti su Windows, OS X e Linux - non viene visualizzato nulla.

Il comportamento di Chrome su Linux è abbastanza confuso per gli utenti.

Qualche idea sul perché Chrome su Linux (stavo testando su Ubuntu 14.04) si comporta in modo diverso da qualsiasi altro SO e browser web?

risposta

3

Il problema è in realtà che se Chrome manca di un gestore di protocollo locale, allora vuole usare il gestore configurato nell'ambiente dell'utente. Nessun due SO fornisce esattamente la stessa API per avviare un gestore predefinito. Capire cosa sarebbe questo programma prima di lanciarlo in realtà non è nemmeno un'API chiara su Windows o Linux.

Entrambe le implementazioni "Mac" e Windows finiscono per sapere quale applicazione esterna è in definitiva responsabile del protocollo e quindi sono in grado di sopprimere le chiamate non gestite senza emettere un avviso di chiamata. Ma l'implementazione di Windows è in realtà un kludge che si basa su osservazioni del registro di Windows su versioni esistenti su Windows. Questo tipo di violazione dell'API è più pericoloso su Linux, dove molti sapori hanno forchette molto diverse degli strumenti delle impostazioni correlate.

In realtà è considered a bug che Windows e OsX non emettono un avviso alternato che non hanno chiamato nulla, quindi si consiglia di commentare qui se si pensa che sia il comportamento giusto.

Ecco la mia osservazione di come il lavoro di 3 sistemi in base alla sorgente di corrente:

Linux

In Linux, al momento della registrazione gestori di protocollo con il sistema (finestra), si fa qualcosa di simile:

xdg-settings set default-url-scheme-handler myprotocol evolution.desktop 

Ora, l'evoluzione applicazione è responsabile per il protocollo e tutto può chiamare:

xdg-open myprotocol:... 

Per ora aprire l'evoluzione su questi collegamenti. Gli altri SO hanno meccanismi simili, ma potrebbero non avere un programma esterno come lo stub della chiamata.

Questo è bello e astratto e knowing/saying the external app you are calling is xdg-open impedisce molte complicazioni nell'implementazione di Linux. Ma non è esattamente l'informazione che l'utente probabilmente vuole. Ottenere tali informazioni richiederebbe invece l'uso di xdg-settings e rischia di essere errato se c'è o sarà sempre un modo per sovrascrivere condizionalmente il gestore predefinito in alcuni ambienti di questo sistema.

di Windows

Nel gestore di Windows, a quanto pare si può solo andare snooping around in the registry e poi formulare un'ipotesi su ciò che chiama l'API sta per effettivamente fare. Tecnicamente, Chrome deve fare questo poiché il modo in cui apre i programmi esterni è attraverso un'API di sistema, quindi non c'è uno stub esterno come xdg-open a cui fare riferimento nell'avviso.

Mac

Nel gestore "mac", v'è un'API corretta per chiedere l'applicazione tuo URL specifico lancerà, in modo da cromo does, allora if the application name the empty string si può cadere completamente la chiamata prima di generare l'avviso.

Problemi correlati