Обмен сообщениями о расширении Safari - PullRequest
2 голосов
/ 05 января 2012

Я работал над расширением Safari и врезался в стену.Я не могу понять, как отправить несколько строк данных из глобального ввода.Я некоторое время искал на этом сайте и на других сайтах и ​​нашел только кусочки, но когда объединение не сработало.

Вот что мне нужно, чтобы выбраться из Globalsafari.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 ]

7 голосов
/ 10 января 2012

Есть несколько проблем с вашими скриптами.

В вашем глобальном скрипте:

  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 работает только внутри внедренных скриптов.

В вашем внедренном скрипте:

  1. Опять же, прослушиватель событий должен быть зарегистрирован в "message", а не в "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
}
1 голос
/ 07 января 2012

Вы можете получить доступ к глобальной странице с помощью

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