2016-02-29 130 views
10

我正在为Linux上的Google Chrome创建自定义协议处理程序。我的链接看起来是这样的:为什么Linux上的Chrome针对未知协议显示“外部协议请求”对话框?

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

我已经注意到,如果“myprotocol:”未注册(不安装我的应用程序),谷歌Chrome在Linux上显示“外部协议请求”对话框,并尝试使用XDG开:

enter image description here

而在其他操作系统,如Windows 10和OS X埃尔卡皮坦什么,如果协议未注册时显示。

我还证实,Firefox可以在Windows,OS X和Linux上一致地处理未知协议 - 不会显示任何内容。

Linux上的Chrome行为对用户来说是相当混乱的。

任何想法为什么Chrome在Linux上(我在Ubuntu 14.04上测试)与其他操作系统和Web浏览器的行为不同?

回答

3

问题是,如果Chrome缺少本地协议处理程序,那么它想要使用在用户环境中配置的处理程序。没有两个操作系统提供完全相同的API来启动默认处理程序。在实际启动它之前弄清楚这个程序会是什么,甚至在Windows或Linux上都不是一个明确的API。

“Mac”和Windows实现最终都知道哪个外部应用程序最终对协议负责,因此能够在不发出呼叫警告的情况下抑制未处理的呼叫。但是windows实现实际上是一个依赖于windows上现有版本的Windows注册表观察的混合物。这种类型的API违例在Linux上更加危险,因为许多风格对相关设置工具的分支非常不同。

它实际上是considered a bug,Windows和OsX不会发出另一个警告,说他们什么也没有调用,所以如果你认为这是正确的行为,你可能想在这里发表评论。

这里是我的如何基于电流源上的3个系统工作观察:

的Linux

在Linux中,当您注册协议处理程序与(窗口)系统,你做这样的事情:

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

,应用演进负责你的协议,任何东西都可以拨打:

xdg-open myprotocol:... 

现在打开这些链接的进化。其他操作系统具有类似的机制,但可能没有外部程序作为调用存根。

这是很好的和抽象的,并且knowing/saying the external app you are calling is xdg-open可以防止在linux实现中的复杂化。但这不完全是用户可能想要的信息。获取这些信息需要使用xdg-settings来代替,如果在此系统的某些版本中存在或将要有条件地覆盖默认处理程序,则风险将不正确。

的Windows

在Windows处理程序,显然你可以去snooping around in the registry,然后作出一个猜测,以什么调用API是要怎么做。从技术上讲,chrome必须这样做,因为它打开外部程序的方式是通过系统API,所以在警告中没有像xdg-open这样的外部存根。

的Mac

在“陆委会”处理程序中,有一个适当的API来询问该应用程序的特定的URL将推出,因此Chrome does,然后if the application name the empty string它可以生成警告之前完全挂断电话。