2016-02-29 11 views
10

Tworzę niestandardowy moduł obsługi protokołu dla Google Chrome w systemie Linux. Mój związek wygląda następująco:Dlaczego Chrome w systemie Linux wyświetla okno dialogowe "Żądanie zewnętrznego protokołu" dla nieznanego protokołu?

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

Zauważyłem, że jeśli „myprotocol:” nie jest zarejestrowany (moja aplikacja nie jest zainstalowana), Google Chrome na Linuksa wyświetla „Protokół zewnętrzne żądanie” dialog i próbuje użyć xdg otwarte :

enter image description here

Podczas innego systemu operacyjnego, takiego jak Windows 10 oraz OS X El Capitan nic nie jest wyświetlane, jeżeli protokół nie jest zarejestrowany.

Sprawdziłem również, że Firefox działa konsekwentnie dla nieznanych protokołów w systemach Windows, OS X i Linux - nic nie jest wyświetlane.

Zachowanie Chrome w systemie Linux jest dość kłopotliwe dla użytkowników.

Każdy pomysł, dlaczego Chrome na Linuksie (testowałem na Ubuntu 14.04) działa inaczej niż jakikolwiek inny system operacyjny i przeglądarki internetowe?

Odpowiedz

3

Problem polega na tym, że jeśli Chrome nie ma lokalnego programu do obsługi protokołów, to chce korzystać z modułu obsługi skonfigurowanego w środowisku użytkownika. Żadne dwa systemy operacyjne nie oferują dokładnie tego samego interfejsu API, aby uruchomić domyślny moduł obsługi. Ustalenie, czym ten program byłby przed jego uruchomieniem, nie jest nawet czystym interfejsem API w systemie Windows ani Linux.

Zarówno "Mac", jak i implementacje Windows, ostatecznie wiedzą, która zewnętrzna aplikacja jest ostatecznie odpowiedzialna za protokół i dlatego są w stanie tłumić nieobsłużone połączenia bez wydawania ostrzeżenia o połączeniu. Ale implementacja okien jest w rzeczywistości kludge, która opiera się na obserwacjach rejestru systemu Windows na istniejących wersjach w systemie Windows. Ten typ naruszenia API jest bardziej niebezpieczny w Linuksie, gdzie wiele smaków ma bardzo różne rozwidlenia powiązanych narzędzi ustawień.

To jest w rzeczywistości considered a bug, że Windows i OsX nie wydają alternatywnego ostrzeżenia, że ​​nic nie nazywają, więc możesz chcieć komentarz tutaj, jeśli uważasz, że to właściwe zachowanie.

Oto moja obserwacja, w jaki sposób praca 3 systemy na podstawie aktualnego źródła:

Linux

W Linuksie, gdy zarejestruj obsługi protokołów z systemem (okno), można zrobić coś takiego:

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

teraz ewolucja aplikacja jest odpowiedzialna za protokół i wszystko może wywołać:

xdg-open myprotocol:... 

Aby teraz otworzyć ewolucję na tych linkach. Pozostałe systemy mają podobne mechanizmy, ale mogą nie mieć zewnętrznego programu jako kodu wywołującego.

To jest ładne i abstrakcyjne, a knowing/saying the external app you are calling is xdg-open zapobiega wielu komplikacjom w implementacji Linuksa. Ale to nie jest dokładnie ta informacja, której prawdopodobnie użytkownik chce. Uzyskanie tych informacji będzie wymagało użycia wartości xdg-settings i może być niepoprawne, jeśli istnieje lub kiedykolwiek będzie sposób na warunkowe zastąpienie domyślnego programu obsługi w niektórych smakach tego systemu.

Okna

W obsługi systemu Windows, widocznie można po prostu iść snooping around in the registry a następnie dokonać zgaduje, co wywołanie API będzie faktycznie zrobić. Technicznie rzecz biorąc, Chrome musi to zrobić, ponieważ sposób, w jaki otwiera on zewnętrzne programy, odbywa się przez systemowy interfejs API, więc nie ma zewnętrznego kodu, takiego jak xdg-open, do którego można się odnosić w ostrzeżeniu.

Mac

W „mac” przewodnika, nie jest właściwa API zapytać o specyficznych aplikacji Twój adres URL będzie uruchomić, więc chrom does, następnie if the application name the empty string może całkowicie upuścić wezwanie przed wygenerowaniem ostrzeżenia.

Powiązane problemy