通过Javascript控制Firefox扩展

Coo*_*ama 5 javascript firefox watir firefox-addon

是否可以使用javascript控制覆盖firefox扩展?我已经提取了扩展的内容,并确定了我需要运行的函数/方法,但是它们在控制台的范围内是不可访问的.

提前感谢任何想法.

nma*_*ier 8

是的,在适当的情况下,可以与其他附加组件进行交互.

我的测试用例将是插件的com.googlecode.sqlitemanager.openInOwnWindow()一部分.SqliteManager

  1. 在较新的版本中(我使用Nightly),有浏览器工具箱.使用它就像打开工具箱并com.googlecode.sqlitemanager.openInOwnWindow()在控制台中执行一样简单.

  2. 您可以改为使用浏览器控制台(或任何支持Chrome的WebDev控制台,例如"about:newtab"的控制台).但是你需要一些样板代码才能找到浏览器窗口.所以这里是您可以在那里执行的代码:var bwin = Services.wm.getMostRecentWindow("navigator:browser"); bwin.com.googlecode.sqlitemanager.openInOwnWindow()

  3. 再次,启用chrome调试.然后打开Scratchpad并在" 环境"菜单中切换到Chrome.现在在我们的Scratchpad中执行将起作用.com.googlecode.sqlitemanager.openInOwnWindow()

  4. 您当然可以编写自己的叠加插件.

  5. 作为最后的手段,修补附加组件本身.

  6. Bootstrapped/SDK附加组件:您可以加载XPIProvider.jsm(最近更改了位置)并通过它来到引导范围(运行环境bootstrap.js)XPIProvider.bootstrapScopes[addonID]并从那里获取(使用引导范围中的任何内容,例如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.
Run Code Online (Sandbox Code Playgroud)

在网络内容中:

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);
Run Code Online (Sandbox Code Playgroud)

  • @Noitidart Bootstrapped附加组件确实难以实现.而且,它取决于实际的实现最好使用什么.但你总是可以通过[`XPIProvider.bootstrapScopes [addonID]`](http://mxr.mozilla.org/mozilla-central/source/)加载XPIProvider.jsm并进入bootstrapped范围(bootstrap.js的运行环境).工具包/ mozapps /扩展/内部/ XPIProvider.jsm#4318) (2认同)
  • 为什么他们继续这个?它在FF30中再次移动,它现在位于*资源://gre/modules/addons/XPIProvider.jsm*所以你现在必须使用`Cu.import('resource:// gre/modules/addons/XPIProvider)导入它. JSM")` (2认同)