bookmarklet如何访问Firefox扩展(反之亦然)

时间:2009-08-18 20:48:55

标签: firefox firefox-addon bookmarklet

我编写了一个Firefox扩展程序,可以在输入特定URL时捕获并执行某些操作。我的主应用程序使用此URL启动Firefox。该URL包含敏感信息,因此我不希望它存储在历史记录中。

我担心没有安装扩展程序的情况。如果它没有安装并且Firefox使用敏感URL启动,它将被存储在历史记录中,我无能为力。所以我的想法是使用书签。

我将使用“javascript:window.location.href ='pleaseinstallthisplugin.html'; sensitiveinfo ='blahblah'”启动Firefox。

如果未安装扩展程序,它们将被重定向到一个页面,告诉他们安装它,并且敏感信息不会存储在历史记录中。如果扩展 IS ,它将获取sensitiveinfo变量中的信息并执行其操作。

我的问题是,bookmarklet可以调用扩展中的方法来传递敏感信息(如果是这样,如何),或者在书签中调用javascript时,扩展会捕获吗?

bookmarklet和Firefox扩展如何通信?

P.S。解决这种情况的替代方法是我的主要应用程序启动Firefox并使用套接字与扩展进行通信,但我不愿意这样做,因为多年来我遇到了太多问题,因为有疯狂防火墙的用户阻塞套接字通讯。如果可能的话,我想做所有没有插座的事情。

3 个答案:

答案 0 :(得分:1)

据我所知,bookmarklets永远不能访问chrome文件(扩展名)。

答案 1 :(得分:1)

Bookmarklet在当前文档的范围内执行,该文档几乎总是内容文档。但是,如果您通过命令行传入它,它似乎工作:

/Applications/Namoroka.app/Contents/MacOS/firefox-bin javascript:alert\(Components\)

如果不允许访问Components,则会抛出,但警报会显示正确的对象。

答案 2 :(得分:1)

您可以使用unsafeWindow注入全局。您可以添加一个纯属性,以便您的书签只需要检测全局是否已定义,但您应该知道,据我所知,没有办法禁止非书签上下文中的网站也嗅探对于同样的全球性(因为某些网站可能会检测他们是否正在使用扩展名,这可能是隐私问题)。我已经在我自己的附加组件中进行了确认,它以类似于下面的方式注入全局,它可以在bookmarklet和常规站点上下文中工作。

如果您注册nsIObserver,例如,content-document-global-created是主题,然后打开subject,则可以注入全局(如果需要,请参阅this用方法注入像对象一样复杂的东西。

这里有一些(未经测试的)代码可以解决这个问题:

var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);
observerService.addObserver({observe: function (subject, topic, data) {

    var unsafeWindow = XPCNativeWrapper.unwrap(subject);
    unsafeWindow.myGlobal = true;

}}, 'content-document-global-created', false);

如果您想在SDK附加组件中使用明显更简单的方法,请参阅thisthis(不确定SDK postMessage通信是否可以作为替代方案,但显然具有相同的关注点这将暴露于非书签环境(即常规网站)。