2

我正在开发一个跨平台的浏览器扩展,并且我所有的代码都基于 Chrome 的方式来做这件事。我指望背景页面可以从选项页面访问,这在 Safari 扩展中是不可能的(因为没有选项页面之类的东西)。您只能safari.extension.globalPage.contentWindow从扩展弹出窗口和后台页面本身访问。

现在,我有一个选项页面,它是扩展包中的一个 html 页面,到目前为止,我还没有找到 Safari 赋予它扩展“权限”的方法。我最接近的是添加仅在选项页面上添加的内容脚本。这似乎有点傻,因为 html 页面本身在扩展包中?!

其他人建议使用异步乒乓式message事件处理程序,甚至是canLoad-机制(“仅”能够在-事件中运行beforeload)。我已经能够canLoad通过伪造来破解同步消息传递的机制BeforeLoadEvent

// Content script (run from anywhere)
var result = safari.self.tab.canLoad(new BeforeLoadEvent, "data")
-> "return value"

// Background page
safari.application.addEventListener('message', function(e) {
    if ( e.name === "canLoad" )
        e.message = "return value";
}, true);

这是一个黑客,但它的工作原理。但是,我被消息传输序列化所困扰,因为我需要能够从后台页面访问对象上的方法和数据。有没有办法解决?

可能可行但我不知道是否可行的可能方法:

  • 从背景页面访问 options-page window-object。那可能吗?
  • 消息传递,需要绕过消息序列化
  • 我可以将对象附加到选项页面并从选项页面获取的任何共享/全局对象?
  • 让 Safari 从内容脚本沙箱外部运行 options.html 页面?它适用于 Chrome,因为它们都在扩展包中。safari 也不这样做,这很烦人。
  • 从弹出窗口中运行选项页面。这是有希望的,但它会使 safari 崩溃(这是非常有希望的!)。然而,从它的外观来看,它只是与我的 options.html 页面中的 CSS 动画有关。最大的问题是它必须能够打开 OAuth2 弹出窗口,但由于能够以编程方式打开弹出窗口,这可能不是问题。但是,此选项是最现实的,但我宁愿在新选项卡中打开它。

任何建议和骇人听闻的解决方法都会有帮助。

4

0 回答 0