外部辅助应用程序服务¶
外部辅助应用程序服务负责确定如何处理尝试加载浏览器本身无法加载的内容。
这部分涉及使用处理程序服务,该服务管理用户对不同内容的默认操作偏好。
单击链接时¶
当页面中的链接被点击(或表单提交)时,nsDocShell
会测试浏览器本身是否可以加载目标协议,这基于 network.protocol-handler
下的偏好设置。当浏览器无法加载协议时,它会调用 nsExternalHelperAppService::LoadURI
。
执行了一些验证检查,但最终我们会查找注册的协议处理程序。首先查询操作系统以获取协议的应用程序注册,然后请求处理程序服务器从内部数据库中填充任何用户设置。如果处理程序服务中没有设置,则会在 nsExternalHelperAppService::SetProtocolHandlerDefaults
中应用一些默认值。
如果选择了默认处理程序应用程序,并且设置指示在不询问用户的情况下使用它,则会执行此操作。否则,将显示一个对话框,询问用户他们希望执行的操作。
加载期间¶
当内容正在加载时,URI 加载器服务 会确定浏览器是否可以处理该内容。如果不能,则它会通过 nsExternalHelperAppService::DoContent
调用外部辅助应用程序服务器。
加载内容的内容类型从通道中检索。文件扩展名也是使用 Content-Disposition 标头生成的,或者如果加载不是 HTTP POST 请求,则文件扩展名是从请求的 URL 生成的。
然后,我们查询 MIME 服务以获取 nsIMIMEInfo 以查找有关可以处理内容类型或文件扩展名的应用程序的信息(基于操作系统和用户设置),请参见下文 以获取更多详细信息。结果用于创建一个 nsExternalAppHandler
,然后将其用作内容的流监听器。
MIME 信息对象包含控制在执行任何操作之前是否提示用户以及默认操作应是什么的设置。如果我们需要询问用户,则会显示一个对话框,允许用户取消加载、将内容保存到磁盘或将其发送到注册的应用程序处理程序。
假设加载未取消,则内容将使用具有目标 nsITransfer
的后台文件保存器流式传输到磁盘。nsITransfer
负责在 UI 中显示下载。
如果用户选择使用应用程序打开文件,则传输完成后,将使用 nsIMIMEInfo::LaunchWithFile
启动应用程序。
MIME 服务¶
MIME 服务负责获取内容类型或文件扩展名的 nsIMIMEInfo
对象。
基于操作系统提供的信息填写
nsIMIMEInfo
。这是特定于平台的,但应尝试查找注册为处理内容的默认应用程序。请求处理程序服务使用浏览器设置中保存的信息填写
nsIMIMEInfo
。这不会覆盖从操作系统找到的任何应用程序。如果尚未找到,则尝试从 查找表 中查找类型描述,或者仅通过在文件扩展名后附加“文件”来查找。