我试图通过Firefox插件覆盖Firefox的nsIURIFixup
默认实现。由于此服务is created once and then cached globally after the construction of nsDocShell
,我必须在初始化任何docshell之前注册我的组件 。因此,我使用chrome.manifest
来注册我的(JS)XPCOM组件,包括profile-after-change
类别,以便尽快加载组件。
这在单进程Firefox(37)中运行良好,但在启用电解(e10s)时却不行(例如在Firefox Nightly中)。此问题是由于加载项chrome.manifest
仅在Firefox的浏览器进程中导入,而不是在激活e10s时导入其内容进程(bug 596880,标记为作为WontFix)。
组件可以通过调用importing a JSM in a frame script的registerFactory
method of nsIComponentRegistrar
在内容流程中动态注册。这可能适用于大多数应用程序,但不适用于我的,因为我的组件必须在构造docshell之前进行初始化,并且看起来框架脚本加载得太晚(即已经构造了docshell)
我还探索了实现我的功能的其他方法,例如跟踪和猴子修补接口的(间接)使用者。我不喜欢这个脆弱的解决方案",因为它依赖于未记录的实施细节,因此可能会在未来的任何时候中断。
我也想到我可以将我的组件附加到Firefox的全局chrome.manifest
,但这似乎也是一个可怕的黑客(如果这个文件是只读的,例如因为它是由一个安装的管理员?AMO接受一个修改Firefox核心文件的插件作为其安装的一部分的几率是多少??)。
那么,如何在创建内容流程时正确注册加载的组件,以便它可以有效地覆盖该流程中接口的实现?