Safari扩展发送消息到注入的脚本

时间:2014-02-12 12:39:03

标签: javascript safari safari-extension

我正在设计一个safari应用程序,并且发现我需要能够将数据从全局页面发送到注入的脚本,并在阅读Apple文档后发现我将需要使用消息。

最初,我试着写信息来做我想要的事情但失败了。然后,我简化了代码,只发送一条基本消息,但也失败了。在将其缩小到我认为错误之后,这是我尝试的代码:

Global.html:

<!DOCTYPE html>
<head>
</head>
<body>
<script type="text/javascript" charset="utf-8">
    // Set up the Listener
    safari.application.addEventListener("command", performCommand, false);

    // Function to perform when event is received
    function performCommand(event) {
        // Make sure event comes from the button
        if (event.command == "parseGrades") {
            alert('made it');
            safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("execute", "engage");
        }
    }
</script>
</body>
</html>

Inject.js:

safari.self.addEventListener("message", handleMessage, false);
function handleMessage(msgEvent) {
    alert('message received');
}

当我运行扩展程序时,我收到一条警告,上面写着“成功”,但我从未收到“收到邮件”的警报(这是我想要的)。

就扩展设置本身而言,我将网站访问权限设置为all并包含安全页面,并将global.html设置为全局页面,将Inject.js设置为结束脚本。

我还尝试将Inject.js设置为启动脚本,但与将其设置为结束脚本具有相同的效果,因此我将其更改为结束脚本。

我用以下内容交叉引用:

  1. https://developer.apple.com/library/archive/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW1 - 根据这些文档,它应该有用
  2. Safari Extension - Message
  3. Safari extension messaging
  4. https://stackoverflow.com/questions/17500614/safari-extension-accessing-variable(已删除)
  5. 等...
  6. 基于这些来源,在我看来它应该有效,但我显然是错的:)。

1 个答案:

答案 0 :(得分:1)

这似乎是因为Safari缓存了页面的扩展脚本,从而阻止了邮件的接收。

这是错误:

undefined is not an object (evaluating 'safari.application.activeBrowserWindow.activeTab.page.dispatchMessage)

这可能意味着safari.application.activeBrowserWindow不存在,因为注入的脚本实际上没有注入,因此没有任何内容可以发送消息。

重新启动Safari似乎可以解决问题。