Closed vedmedka closed 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.
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?