Расширение Safari отправляет сообщение на определенную вкладку

Есть ли способ отправить сообщение с глобальной страницы на определенную вкладку?
В настоящее время я делаю следующее: при создании вкладки внедренный скрипт создает уникальный идентификатор и отправляет сообщение с этим номером на глобальную страницу, а глобальная страница сохраняет этот номер.
Если глобальной странице необходимо отправить некоторые данные на вкладку (например, вкладку #3), то глобальная страница будет "транслировать" сообщение на все вкладки с номером #3 как часть данных, передаваемых на вкладки (итерация по все вкладки и отправить сообщение на каждую вкладку).
Есть ли что-нибудь вроде Chrome: (например, chrome.tabs.sendRequest(tabID, {action: 'respond', params:[channel,msg,async]});)?

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

Есть ли более простой и элегантный способ сделать это в Safari?


person erez    schedule 26.03.2012    source источник


Ответы (2)


В обработчике событий сообщений глобальной страницы event.target относится к вкладке, с которой было получено сообщение. Например:

function handleMessage(e) {
    if (e.name === 'whatIsMyUrl?') {
        e.target.page.dispatchMessage('yourUrlIs', e.target.url);
    }
}
safari.application.addEventListener("message", handleMessage, false);

API расширения Safari не имеет идентификаторов вкладок, но вы можете просто сохранить каждую вкладку в ассоциативном массиве и использовать ее индекс для обращения к ней позже. Например:

function handleMessage(e) {
    if (e.name === 'hereIsMyId') {
        myTabs[e.message] = e.target;
    }
}
safari.application.addEventListener("message", handleMessage, false);

// later...
myTabs[someId].page.dispatchMessage('haveSomeCake');
person chulster    schedule 26.03.2012

Ответ Safari

На вашей глобальной странице сохраните прямо на вкладке .. так, например, в сообщении из внедренного скрипта

// global page
safari.application.addEventListener("message", function(event){
    switch(event.name){
        case "saveData":
            event.target.page.tabData = { data: myData }
        break;
        case "getData":
            event.target.page.dispatchMessage("tabData", myData);
        break;
    }
}, false);

-

// injected page

// first save data
safari.self.tab.dispatchMessage("saveData", {firstname:"mike", age: 25} );

// setup listner to recevie data
safari.self.addEventListener("message", function(event){
    switch(event.name){
        case "tabData":
            // get data for page
            console.debug(event.message);
            // { firstname: "mike", age: 25 }
        break;
    }
}, false);

// send message to trigger response
safari.self.tab.dispatchMessage("getData", {} );
person mc.    schedule 18.08.2014
comment
и вам придется делать дополнительные вещи, чтобы справиться с новым сафари с большим количеством страниц, загруженных заранее, я думаю - person mc.; 19.08.2014