我编写了一个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并使用套接字与扩展进行通信,但我不愿意这样做,因为多年来我遇到了太多问题,因为有疯狂防火墙的用户阻塞套接字通讯。如果可能的话,我想做所有没有插座的事情。
答案 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附加组件中使用明显更简单的方法,请参阅this和this(不确定SDK postMessage
通信是否可以作为替代方案,但显然具有相同的关注点这将暴露于非书签环境(即常规网站)。