KangoExtensions / kango

Kango framework issue tracker
74 stars 7 forks source link

Unable to dispatch message to newly created tab #104

Closed vedmedka closed 9 years ago

vedmedka commented 9 years ago

I would like to create a tab then dispatch a message to it. Obvious way inspired by documentation is: kango.browser.tabs.create({url: url, focused: true}); kango.browser.tabs.getCurrent(function(tab) { tab.dispatchMessage(message, data); }); But unfortunately it not worked.

I tried something as described here: http://stackoverflow.com/questions/19964014/how-to-listen-the-event-document-complete-in-firefox-with-kango-framework

var handle = function (event) { var tab = event.target; kango.browser.removeEventListener(kango.browser.event.DOCUMENT_COMPLETE , handle); tab.dispatchMessage(message, data); };

kango.browser.addEventListener(kango.browser.event.DOCUMENT_COMPLETE, handle); kango.browser.tabs.create({url: url, focused: true});

It not worked too.

Is it possible in kango to create a tab and send a message to newly created tab?

vedmedka commented 9 years ago

My workaround finally based on undocumented feature of tab.dispatchMessage. It returns boolean if message was dispatched. For safari browser I had to add browser-dependendent code that wait unil 'navigate' event appeared:

my.tabs.getTabByUrl = function (url, onDone, onNotFound) {
    kango.browser.tabs.getAll(function(tabs) {
        var isFound = false;
        for (var i = 0; i < tabs.length; i++) {
            var aTab = tabs[i];
            if (aTab.getUrl().indexOf(url) > -1) {
                isFound = true;
                onDone(aTab);
                break;
            }
        }
        if (!isFound) {

            if (typeof onNotFound == 'function') {
                onNotFound();
            }
        }
    });
};

my.tabs.createAndSendMessage = function (url, message, data) {

    var nAttempts = 100;

    function tryGetTabAndSendMessage() {
        if (nAttempts-- > 0) {
            window.setTimeout(function(){
                my.tabs.getTabByUrl(url, function(tab) {

                    var result = tab.dispatchMessage(message, data);

                    if (!result) {

                        tryGetTabAndSendMessage();
                    }
                }, function() {

                    tryGetTabAndSendMessage();
                });
            }, 500);
        }
    }

    var safariTab = null;

    var safariNavigateHandler = function () {

        tryGetTabAndSendMessage();
        if (safariTab != null) {
            safariTab.removeEventListener("navigate", safariNavigateHandler);
            safariTab = null;
        }
    };

    function safariCreateTabAndWaitUntilWillNavigate() {

        var aTab = safari.application.activeBrowserWindow.openTab('foreground');

        aTab.url = url;
        aTab.addEventListener("navigate", safariNavigateHandler, false);
        return aTab;
    }

    if (my.browser.isSafari()) {

        safariTab = safariCreateTabAndWaitUntilWillNavigate();
    } else {

        kango.browser.tabs.create({url: url, focused: true});
        tryGetTabAndSendMessage();
    }

};

my.browser = {};
my.browser.isSafari = function () {
    return 'safari' == kango.browser.getName()
};

It looks little weird and overcomplicated. It would be better if kango framework provide built-in solution for tab creation and sending a message to it.