Почему Chrome на Linux показывает диалог "Запрос внешнего протокола" для неизвестного протокола?

Я создаю собственный обработчик протокола для Google Chrome в Linux. Моя ссылка выглядит так:

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

Я заметил, что если "myprotocol:" не зарегистрирован (мое приложение не установлено), Google Chrome в Linux отображает диалоговое окно "Запрос внешнего протокола" и пытается использовать xdg-open:

введите описание изображения здесь

В то время как на других ОС, таких как Windows 10 и OS X El Capitan, ничего не отображается, если протокол не зарегистрирован.

Я также подтвердил, что Firefox работает последовательно для неизвестных протоколов в Windows, OS X и Linux - ничего не отображается.

Поведение Chrome в Linux довольно запутанно для пользователей.

Любая идея, почему Chrome на Linux (я тестировал Ubuntu 14.04), отличается от других ОС и веб-браузеров?

Ответ 1

Проблема в том, что если у Chrome не хватает локального обработчика протокола, он хочет использовать обработчик, настроенный в пользовательской среде. Никакие две ОС не предоставляют точно такой же API для запуска обработчика по умолчанию. Выяснив, что будет делать эта программа до ее запуска, это даже не ясный API для Windows или Linux.

Оба варианта "Mac" и Windows в конечном итоге знают, какое внешнее приложение в конечном счете несет ответственность за протокол и поэтому могут подавлять необработанные вызовы, не вызывая предупреждения о вызове. Но реализация windows на самом деле - это kludge, который опирается на наблюдения за реестром Windows на существующие версии на окнах. Этот тип нарушения API более опасен для Linux, где многие вкусы имеют очень разные вилки связанных инструментов настройки.

Фактически считается ошибкой, что Windows и OsX не выдают альтернативное предупреждение, что они ничего не вызывали, поэтому вы можете захотеть прокомментировать здесь, если вы считаете, что это правильное поведение.

Вот мое наблюдение за тем, как 3 системы работают на основе текущего источника:

Linux

В Linux, когда вы регистрируете обработчики протоколов с помощью (окна) системы, вы делаете что-то вроде:

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

Теперь эволюция приложения отвечает за ваш протокол, и все может вызвать:

 xdg-open myprotocol:...

Теперь откройте эволюцию на этих ссылках. Другие операционные системы имеют аналогичные механизмы, но не могут иметь внешнюю программу в качестве заглушки вызова.

Это красиво и абстрактно и зная/говоря, что внешнее приложение, которое вы вызываете, является xdg-open, предотвращает много осложнений в реализации linux. Но это не совсем информация, которую пользователь, возможно, хочет. Получение этой информации потребует использования xdg-settings вместо этого и может быть неправильным, если есть или когда-либо будет способ условно переопределить обработчик по умолчанию в некоторых вариантах этой системы.

Окна

В обработчике Windows, по-видимому, вы можете просто отслеживать в реестре, а затем сделать обоснованное предположение о том, что вызывает api на самом деле. Технически хром должен делать это, так как он открывает внешние программы через системный API, поэтому в предупреждении нет внешнего заглушки типа xdg-open.

Mac

В обработчике "mac" есть соответствующий API, чтобы спросить о приложении, которое запускает ваш конкретный URL-адрес, поэтому chrome делает, затем если имя приложения пустая строка, он может полностью отказаться от вызова перед генерированием предупреждения.