Ответ 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 делает, затем если имя приложения пустая строка, он может полностью отказаться от вызова перед генерированием предупреждения.