Есть некоторые библиотеки ( эта, например ), которые говорят, что они могут обнаруживать пользовательские протоколы, но я не нашел ни одной, которая бы работала с последней версией Firefox.
Самый надежный (chrome, edge, firefox, ie 11) и простой способ, который я нашел, это просто создать скрытый iframe. Тогда вы можете просто поставить кнопку загрузки на той же странице.
iframe {
display: none;
}
<iframe src="ms-calculator://"></iframe>
<iframe src="nonexistentscheme://"></iframe>
<a href="">Download</a>
ПРИМЕЧАНИЕ: Firefox разрешает диалог только каждые 10 секунд.
РЕДАКТИРОВАТЬ: Также работает в IE 11