2012-01-05 7 views
2

私はSafari拡張機能に取り組んでおり、壁に衝突しました。私はグローバルからインジェクションに複数行のデータを送る方法を理解できません。 私はこのサイトや他のサイトでしばらく検索してきましたが、ビットとピースは見つかっていませんでしたが、失敗した場合は失敗しました。Safari拡張メッセージング

は、相続人は、私はグローバル
safari.extension.secureSettings.username;
safari.extension.secureSettings.password;
から抜け出すために必要なものを私はグローバル変数にそれらをputing試してみたが、注入はそれらを見ていません。

ジェクトコード

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

関連する問題