2012-01-05 3 views
2

저는 Safari 확장 프로그램에서 작업 중이며 벽에 부딪혔습니다. 전역에서 주입까지 여러 줄의 데이터를 보내는 방법을 알아낼 수 없습니다. 저는이 사이트와 다른 사이트에서 잠시 동안 검색을 해왔지만 비트와 조각 만 발견했습니다. 분사는 사람들을 볼 수 없습니다Safari 확장 메시징

나는 safari.extension.secureSettings.username;
내가 전역 변수로 퍼 팅 시도했습니다 safari.extension.secureSettings.password;
글로벌
나갈 필요하지만 Heres는 것.

분사 코드

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

나는 애플의 문서에서 코드를 시도하지만 분사 코드 중 하나를 실행하지 않을 것입니다.

편집 여기까지 제가 지금까지 있습니다. 나는 왜 그것이 수신되지 않거나 전송하지 않는지 잘 모르겠습니다.

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

당신은 주입 된 스크립트에 글로벌 페이지에서 메시지를 보내야합니다. 도움이 필요한 경우 다음 페이지를 읽고 여기에 의견을 게시하십시오. http://developer.apple.com/library/safari/ipad/#documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html – canisbos

+0

나는 아직도 그것을 얻을 수 없다. 지금까지 작성한 내용을 추가 할 수 있습니다. 나는 송수신이 문제인지 아닌지 잘 모르겠다. 마치 작동하지 않는 것처럼 보인다. – WatsonN

+0

늦게 답장을 드려 죄송합니다. Stack Overflow가 댓글을 달았을 때 이메일을 보낼 것이라고 생각했지만 그렇지 않았습니다. 아래에 답변을 추가했습니다. – canisbos

답변

7

와 글로벌 페이지에 액세스 할 수 있습니다. 글로벌 스크립트에서

: 당신은 "메시지"이벤트에 이벤트 리스너를 등록해야

  1. ; 'messageFromNSA'은 (는) 올바른 이벤트 유형이 아닙니다. 또한 safari.self.addEventListener 대신 safari.application.addEventListener을 사용해야합니다.
  2. 기능이 sendCred() 인 경우 요청을 보낸 페이지로 메시지를 보내려면 safari.self.tab.dispatchMessageevent.target.page.dispatchMessage으로 변경하십시오. event.target은 메시지를 보낸 탭입니다. page은 해당 탭의 문서에 대한 프록시입니다. safari.self.tab은 삽입 된 스크립트에서만 작동합니다. 당신의 주입 스크립트에서

는 :

  1. 다시, 이벤트 리스너가 아니라 "nsaArray" "메시지"에 등록해야합니다.
  2. 기능이 recieveCred(msgEvent) 인 경우 로컬 변수로 myNSAusernamemyNSApassword을 정의 했으므로 showForm() 기능을 볼 수 없습니다. 전역 변수로 사용하려면 키워드 var을 제거하십시오.

다음은 추가 설명과 함께 작동해야하는 수정 된 전역 및 주입 스크립트입니다.

글로벌 스크립트

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 
} 
+0

대단히 감사합니다. 매우 도움이되었습니다. 유일한 것은 내가 그것을 실행하려고 시도하고 실패했습니다. 나는 콘솔이 실행될 때마다 콘솔에 로그를 남기고 로그를 보냈다. 내가 얻을 수 있었던 유일한 로그는 윈도우가 최고라고 말했고, 전역이나 메시지 핸들러에서 아무것도 볼 수 없었다. – WatsonN

+0

.safariextz 파일을 보내 주시면 문제를 찾을 수 있는지 살펴보고 다행스럽게 보입니다. [email protected] – canisbos

+0

죄송 합니다만, 나는 귀하가 통지 이메일에 관한 것과 동일한 인상을 받았습니다. 나는 그것을 보냈어, 정말 고마워! – WatsonN

1

당신은 당신의 스크립트 몇 가지 문제가 있습니다

const myGlobal = safari.extension.globalPage.contentWindow; 
alert (myGlobal.my_variable); 
+0

나는 그것을 사용하려했지만, 그것은 전체 스크립트를 멈추고 아무것도하지 않을 것이다. 그 줄을 주석 처리하자마자 다시 뛰었습니다. – WatsonN