是否可以使用javascript控制覆盖火狐扩展?我已经提取了扩展的内容,并确定了我需要运行的函数/方法,但是它们在控制台的范围内是不可访问的。
提前感谢任何想法。
答案 0 :(得分:8)
是的,在适当的情况下,可以与其他附加组件进行交互。
我的测试用例将是com.googlecode.sqlitemanager.openInOwnWindow()
,这是SqliteManager
addon的一部分。
在较新版本中(我正在使用Nightly),有Browser Toolbox。使用它就像打开工具箱并在控制台中执行com.googlecode.sqlitemanager.openInOwnWindow()
一样简单。
您可以使用浏览器控制台(或任何支持Chrome的WebDev控制台),例如“about:newtab”的控制台。但是你需要一些样板代码才能找到浏览器窗口。以下是您可以在那里执行的代码:var bwin = Services.wm.getMostRecentWindow("navigator:browser"); bwin.com.googlecode.sqlitemanager.openInOwnWindow()
再次,enable chrome debugging。然后打开Scratchpad并在 Environment 菜单中切换到 Chrome 。现在在我们的Scratchpad中执行com.googlecode.sqlitemanager.openInOwnWindow()
将起作用。
您当然可以编写自己的叠加插件。
作为最后的手段,修补附加组件本身。
Bootstrapped / SDK加载项:您可以加载XPIProvider.jsm
(最近更改了位置)并通过XPIProvider.bootstrapScopes[addonID]
进入自举范围(bootstrap.js
的运行环境),并从那里获取(使用引导范围内的任何内容,例如SDK加载程序)。
现在关于正确的情况:您是否以及如何与某个加载项进行交互取决于加载项。加载项可能在其叠加层中具有全局符号,因此也可能在浏览器窗口中具有全局符号,例如在我使用的示例中。或者可以使用(在某种程度上)JS代码模块。或者拥有自己的自定义加载程序(例如AdBlock Plus有自己的require()
- 类似的东西,SDK附加组件有自己的加载器,这不容易渗透)...
由于您的问题相当不明确,我会将其留在此处。
问题提问者编辑:这是正确的,但我想我最后会添加一个代码示例,最后直接来自mozilla的开发者网络网站:
在我的chrome js中:
var myExtension = {
myListener: function(evt) {
IprPreferences.setFreshIpStatus(true); // replace with whatever you want to 'fire' in the extension
}
}
document.addEventListener("MyExtensionEvent", function(e) { myExtension.myListener(e); }, false, true);
// The last value is a Mozilla-specific value to indicate untrusted content is allowed to trigger the event.
在网络内容中:
var element = document.createElement("MyExtensionDataElement");
element.setAttribute("attribute1", "foobar");
element.setAttribute("attribute2", "hello world");
document.documentElement.appendChild(element);
var evt = document.createEvent("Events");
evt.initEvent("MyExtensionEvent", true, false);
element.dispatchEvent(evt);
答案 1 :(得分:1)
Firefox 47中的情况发生了巨大变化。这是访问它的新方式。
var XPIScope = Cu.import('resource://gre/modules/addons/XPIProvider.jsm');
var addonid = 'Profilist@jetpack';
var scope = XPIScope.XPIProvider.activeAddons.get(addonid).bootstrapScope
更新今天的方法
通常你会这样做:
如果我想进入AdBlocks范围,我会检查AdBlock ID,它是{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}
所以我会去:
var XPIScope = Cu.import('resource://gre/modules/addons/XPIProvider.jsm');
var adblockScope = XPIScope.XPIProvider.bootstrapScopes['{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}'];
您现在可以点击任何内容。
另一个例子,我有一个安装了id NativeShot@jetpack
我会像这样点击它:
var XPIScope = Cu.import('resource://gre/modules/addons/XPIProvider.jsm');
var nativeshotScope = XPIScope.XPIProvider.bootstrapScopes['NativeShot@jetpack'];
如果你console.log(nativeshotScope)
,你会看到里面的一切。