我维护了一个使用附加SDK(基于jpm
工具)开发的Firefox附加组件。它使用两个内容脚本:一个用于将外部库(highlight.js)注入页面,另一个用于从第一个脚本调用函数。
+--------------------------------------------+
| Add-on script |
+--------------------------------------------+
| |
+-----------|--------------------|-----------+
| +---------V--------+ +--------V---------+ |
| | highlight.min.js | | enlightscript.js | |
| | | | | |
| | hljs.func() <--- calling | |
| +------------------+ +------------------+ |
| web page |
+--------------------------------------------+
直到最近,我没有遇到任何问题:我可以从附加脚本中注入两个内容脚本(完整代码here):
...
contentScriptFile: [
self.data.url(script_dir + "/highlight.min.js"),
self.data.url("enlightscript.js")
]
...
调用附加到第二个脚本(代码here)内第一个脚本中定义的对象的函数:
// defined in highlight.min.js, called from enlightscript.js
hljs.initHighlighting();
这是可能的,因为window.hljs
对象在第一个脚本中定义如下:
// definition in highlight.min.js
window.hljs = some_function_definition();
但是这个图书馆正在不断发展,在最近的commit中,这个定义变成了:
// new definition in highlight.min.js
// (it is supposed to be called either in the global namespace,
// in which case self is equivalent to window, or from within a
// worker)
self.hljs = some_function_definition();
在我的情况下,self
对象不引用window
,我不能再直接调用该函数。到目前为止,我还没有找到任何有效的解决方案。
请注意,我绝对不能编辑highlight.min.js
脚本(因此我无法恢复修改或更改其调用方式)。
有人知道是否可以从第二个脚本(hljs.initHighlighting();
)到达并调用enlightscript.js
函数?
我已经联系了库的开发人员,他们很友好地修改了他们的代码,所以我没有更多的问题来调用我的对象。我仍然会对答案感兴趣 - 记录。