Self.port не определен

У меня есть iframe в popup.html с id = Receiver, который получает и отправляет сообщения.

Нижеприведенный код взят из popup.js:

self.port.on("show", function(title, url) {
    myApp.initialize(title, url);
});


var arr = new Array();
var myApp = {
    initialize: function (url,title){
        arr = [];
        arr.push(url);
        arr.push(title);

        var receiver = document.getElementById('Receiver').contentWindow;
        receiver.postMessage(arr, "*");
    },
    sendDetails : function(){
        alert("arr :"+arr);
    },
    closeIt : function(){
        self.port.emit("close-it");
    }
}  

window.addEventListener("message" , receiveMessageOnce, false);
function receiveMessageOnce(event){
    myApp.closeIt();
}

Код из main.js:

main_panel.on("show", function() {
    main_panel.port.emit("show", UrlActiveTab, TitleActiveTab);
});

Теперь у меня есть 2 вопроса:
1.) Всякий раз, когда он получает сообщение, myApp.CloseIt() запускается. Но консоль говорит, что self.port не определен. Я пытался использовать addon.port, который также выдает ошибку.
2.) Если вызывается myApp.sendDetails(), он предупреждает значение 'arr' как пустое, несмотря на то, что это глобальный массив. Почему так?

EDITED: Код конструктора панели:

var { ToggleButton } = require('sdk/ui/button/toggle');
const panel = require('sdk/panel');
var main_panel = panel.Panel({
    contentURL: data.url("popup.html"),
    contentScriptFile: [
        data.url('js/jquery-1.10.2.min.js'),
        data.url("js/popup.js")
    ],
    width: 350,
    height: 400
});

var button = ToggleButton({
    id: "myaddon_beta",
    label: "My Addon",
    icon: {
        "16": "./img/icon_main_16.png",
        "32": "./img/icon_main_32.png",
        "64": "./img/icon_main_64.png"
    },
    onChange : handleChange
});

function handleChange(state){
    currentUrl = tabs.activeTab.url;
    currentTitle = tabs.activeTab.title;
    if(state.checked){
        main_panel.show({
            position : button
        });

        button.state("window", {
            checked: false
        });
    }
}

person ignVinayak    schedule 09.06.2014    source источник
comment
Если self.port не определен, то initialize никогда не вызывается, поэтому никогда не будет вызываться postMessage, поэтому не будет вызываться и receiveMessageOnce. Если они вызываются, как вы сказали, то должен быть определен self.port. Я согласен с @paa ниже, что вы должны использовать addon.port, но, поскольку вы заявляете, что пробовали это, я не вижу, в чем проблема. Можем ли мы увидеть ваш код конструктора панели?   -  person willlma    schedule 09.06.2014
comment
@willlma: Привет, добавил код конструктора. Инициализация работает, сначала все работает. Но когда запускается «closeIt()», он говорит, что он не определен   -  person ignVinayak    schedule 10.06.2014
comment
Может ли быть так, что контекст window, в котором выполняется функция CloseIt, имеет другой объект self? Попробуйте определить глобальный var port = self.port, а затем заставить closeIt запускать port.emit("close-it").   -  person willlma    schedule 10.06.2014
comment
@willlma: я попытался сделать переменную глобальной и использовать ее вместо self.port, но она тоже возвращается как неопределенная. Несмотря на то, что он выполняет требуемое действие, но возвращает значение undefined.   -  person ignVinayak    schedule 10.06.2014
comment
Таким образом, main.js получает событие "close-it", но если вы делаете console.log(port) внутри closeIt(), он печатает undefined? Это было бы крайне странно. Можете ли вы обновить свой код, чтобы показать мне, где вы входите в консоль? Кроме того, вы запускаете этот скрипт в среде расширения, а не просто тестируете его на HTML-странице, верно?   -  person willlma    schedule 10.06.2014
comment
@willlma: см. это: s30.postimg.org/xobju3yb5/Snap008.png ошибка возникает, когда closeIt срабатывает. Да, я запускаю скрипт только в расширении. Чтобы быть более понятным, используйте аддон sdk-1.16.   -  person ignVinayak    schedule 10.06.2014
comment
Очень странно. Не уверен, в чем проблема. Если вы хотите отправить мне xpi, я могу попробовать отладить его со своей стороны.   -  person willlma    schedule 10.06.2014
comment
@willlma: Боюсь, я не могу отправить тебе это. Извини. Обязательно свяжемся с вами, если понадобится дополнительная помощь. Спасибо :)   -  person ignVinayak    schedule 11.06.2014


Ответы (1)


Панели считаются доверенным содержимым, поскольку они принадлежат вам. Побочным эффектом этого является то, что API обмена сообщениями доступен через глобальный addon, а не self, как в случае со сценариями с простым содержимым.

person paa    schedule 09.06.2014
comment
Я пытался использовать addon.port, который также выдает ошибку. - person willlma; 09.06.2014