Safari扩展消息

时间:2012-01-05 07:31:12

标签: javascript safari safari-extension

我一直在开发Safari扩展程序并且已经碰壁了。我无法弄清楚如何从全局向注入发送多行数据。 我一直在这个网站和其他网站上搜索一段时间,但只找到了点点滴滴,但是当它们合并失败时。

继承全球所需要的东西     safari.extension.secureSettings.username;
    safari.extension.secureSettings.password;
我已经尝试将它们放入全局变量,但注入并没有看到它们。

注入代码

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文档中的代码,但它不会运行任何注入代码。

修改 这是我到目前为止所拥有的。我不知道为什么它没有接收或发送。

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);

2 个答案:

答案 0 :(得分:7)

您的脚本存在一些问题。

在您的全局脚本中:

  1. 您需要在“message”事件中注册事件监听器; “messageFromNSA”不是有效的事件类型。此外,您需要使用safari.application.addEventListener而不是safari.self.addEventListener
  2. 在功能sendCred()中,将safari.self.tab.dispatchMessage更改为event.target.page.dispatchMessage,因为您要将邮件分发到发送请求的页面。 event.target是发送邮件的标签; page是该选项卡中文档的代理。 safari.self.tab仅适用于注入的脚本。
  3. 在您的注入脚本中:

    1. 同样,事件监听器需要在“message”上注册,而不是“nsaArray”。
    2. 在函数recieveCred(msgEvent)中,您已将myNSAusernamemyNSApassword定义为局部变量,因此函数showForm()无法看到它们。删除关键字var以使其成为全局变量。
    3. 以下是经过修改的全局和注入脚本,应该有其他注释。

      全局脚本:

      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);
      

      注册脚本:

      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
      }
      

答案 1 :(得分:1)

您可以使用

访问全局页面
const myGlobal = safari.extension.globalPage.contentWindow;
alert (myGlobal.my_variable);