2011-08-25 68 views
1

我如何让正在运行的进程知道在Safari中点击了上下文菜单?如何通过Safari扩展与外部世界进行通信?

我读过这是不可能的,由于安全,但这似乎是错误的,因为1Password以某种方式从桌面应用程序的数据库中的所有信息到Safari扩展。我编写了扩展来显示上下文菜单,并尝试向本地主机发送XMLRPC请求,但无法使其工作。

+0

我不敢相信这是不可能的!我期待着做同样的事情。做1password的方式似乎有点极端,对于大型项目来说也有风险...... –

+0

有关Safari浏览器扩展的极好教程:http://arstechnica.com/apple/2010/06/safari-5-extensions-how-to -develop/3/ – bear

回答

1

我不确定这一点,但我认为1Password通过让后台进程(1PasswordAgent)持续轮询扩展的本地数据库和/或配置文件中的某些更改来做到这一点。例如,要将密码初始化为扩展名,扩展名可以在其localStorage数据库中设置一个特定标志,该标志将(通过Safari,而不是扩展名)写入文件。然后,代理会注意到文件中的标志,并将密码从主密码1Password数据库复制到扩展的本地数据库中。同样,当扩展创建新的密码输入时,代理将注意到扩展数据库中的更改并将其镜像到1Password数据库。

也许你可以做类似的事情?

+0

那么,你说1password有2个应用程序编辑本地存储器(Safari和后台进程)?这不危险吗? –

+0

来自** developer.apple.com **:“不要使用自定义IPC方法与Native OS X应用程序对话。当您的Safari扩展需要与您的OS X应用程序通信时,请使用附带的应用程序扩展。其他方法,如NPAPI插件和WebSocket,不提供任何安全保护,并且可以被攻击者拦截或修改。“ – ZedTuX

1

虽然我不知道1Password的实现,但LiveReload通过使用WebSocket连接到本地主机URL(由应用程序处理)实现相同。如果从全球的网页做,跨域限制并不适用,所以你可以自由连接到任何网址:

var ws = new WebSocket("ws://localhost:98765"); 
... 

(注意与本地主机的东西,不过,Chrome浏览器在Linux上要0.0。 0.0而不是127.0.0.1或localhost。至少它曾经需要它。)

相关问题