2012-01-05 7 views
2

Я работаю над расширением Safari и ударил стену. Я не могу понять, как отправить несколько строк данных из глобального в инжекцию. Я искал какое-то время на этом сайте, а другие, и только нашел бит и куски, но когда они были объединены, не удалось.Обмен сообщениями Safari

Вот что мне нужно выйти из Global
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); 
+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.application.addEventListener, а не safari.self.addEventListener.
  2. В функции sendCred(), изменение safari.self.tab.dispatchMessage на event.target.page.dispatchMessage, так как вы хотите отправить сообщение на страницу, отправившую запрос. event.target - вкладка, которая отправила сообщение; page является прокси для документа на этой вкладке. safari.self.tab работает только внутри вложенных скриптов.

В вашем нагнетаемой сценарий:

  1. Опять же, слушатель событий должен быть зарегистрирован на "сообщение", а не "nsaArray".
  2. В функции recieveCred(msgEvent) вы определили myNSAusername и myNSApassword как локальные переменные, поэтому функция 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

Смежные вопросы