javascript - Safari 扩展消息传递

标签 javascript safari safari-extension

我一直在开发 Safari 扩展,但遇到了瓶颈。我无法弄清楚如何将多行数据从全局发送到注入(inject)。 我在这个网站和其他网站上搜索了一段时间,只找到了一些零碎的东西,但结合起来就失败了。

这是我需要离开 Global 的东西
safari.extension.secureSettings.username;
safari.extension.secureSettings.password;
我试过将它们放入全局变量中,但注入(inject)看不到它们。

注入(inject)代码

document.getElementById('local_login').style.display='';
document.getElementById('local_login_link').style.display = 'none';
document.loginForm.username.value = /*Safari Secure Settings Username*/
document.loginForm.password.value = /*Safari Secure Settings Password*/
document.getElementById('localsubmit').click();

我尝试了 Apple 文档中的代码,但它不会运行任何注入(inject)代码。

编辑 这是我到目前为止所拥有的。我只是不确定为什么它没有接收或发送。

Global.html

function sendCred() {
    myUsername = safari.extension.secureSettings.username;
    myPassword = safari.extension.secureSettings.password;
    var arrayNSA = [myUsername, myPassword];
    safari.self.tab.dispatchMessage("nsaArray", arrayNSA);
}

safari.application.addEventListener("messageFromNSA", sendCred, false);

注入(inject).js

function showForm() {
    document.getElementById('local_login').style.display='';
    document.getElementById('local_login_link').style.display = 'none';
    document.loginForm.username.value = myNSAusername;
    document.loginForm.password.value = myNSApassword;
    document.getElementById('localsubmit').click();
}

function recieveCred(msgEvent) {
   var nsaMessageName = msgEvent.name;
   var nsaMessageData = msgEvent.message;
   if (nsaMessageName === "nsaArray") {
       var myNSAusername = nsaMessageData[0];
       var myNSApassword = nsaMessageData[1];
       showForm();
    }
}

function disbatchData() {
    var nflksnfll = "Give me my data";
}

safari.self.addEventListener("nsaArray", recieveCred, false);
safari.self.tab.dispatchMessage("msgFromNSA", disbatchData);

最佳答案

您的脚本存在一些问题。

在你的全局脚本中:

  1. 您需要在“消息”事件上注册事件监听器; “messageFromNSA”不是有效的事件类型。此外,您需要使用 safari.application.addEventListener 而不是 safari.self.addEventListener
  2. 在函数sendCred()中,将safari.self.tab.dispatchMessage改为event.target.page.dispatchMessage,因为你想将消息发送到发送请求的页面。 event.target 是发送消息的标签; page 是该选项卡中文档的代理。 safari.self.tab 仅在注入(inject)的脚本中有效。

在你注入(inject)的脚本中:

  1. 同样,事件监听器需要在“message”而非“nsaArray”上注册。
  2. 在函数 recieveCred(msgEvent) 中,您已将 myNSAusernamemyNSApassword 定义为局部变量,因此函数 showForm() 看不到它们。删除关键字 var 使它们成为全局变量。

这里是经过修改的全局脚本和注入(inject)脚本,应该可以正常工作,并附有附加注释。

全局脚本:

function handleMessage(event) {
    // use a switch statement and a more generic function name
    // so you can use it to handle other messages in the future
    switch (event.name) {
        case 'sendNsaArray': {
            // I changed the name of the message sent from the
            // injected script to 'sendNsaArray'
            var myUsername = safari.extension.secureSettings.username;
            var myPassword = safari.extension.secureSettings.password;
            var arrayNSA = [myUsername, myPassword];
            event.target.page.dispatchMessage('nsaArray', arrayNSA);
            break;
        }
    }
}

safari.application.addEventListener("message", handleMessage, false);

注入(inject)的脚本:

function showForm(username, password) {
    // why not pass the values to this function instead of using globals
    document.getElementById('local_login').style.display = '';
    document.getElementById('local_login_link').style.display = 'none';
    document.loginForm.username.value = username;
    document.loginForm.password.value = password;
    document.getElementById('localsubmit').click();
}

function handleMessage(event) {
    // again using a more generic function name
    switch (event.name) {
        case 'nsaArray': {
            showForm(event.message[0], event.message[1]);
            // passing the username and password to showForm()
            // instead of storing them in global variables
            break;
        }
    }
}

if (window === window.top) {
    // this conditional prevents the injected script from
    // working inside iframes
    safari.self.addEventListener('message', handleMessage, false);
    safari.self.tab.dispatchMessage('sendNsaArray');
    // not necessary to send any data with this message
}

关于javascript - Safari 扩展消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739047/

相关文章:

macos - Safari 扩展 - 证书

javascript - 存储一个 php 数组客户端

svg - %tagElement% 上的 href 的命名空间前缀 NS1 未定义,setAttributeNS

javascript - php & mysql 和 ajax(将图像插入 CRUD 应用程序)

html - 下拉菜单在 Safari 浏览器中无法正确显示

javascript - Safari 在页面加载的第一个 "focus"事件上抖动/跳跃(错误?)

javascript - 使用 JavaScript 解析带有竖线字符的短语

javascript - Safari 扩展向注入(inject)的脚本发送消息

javascript - 如何在 AngularJS ui-grid 中自动调整列宽

javascript - 线下优先!无法将 Chrome 扩展代码注入(inject)离线页面