Расширение Chrome: вкладка прослушивания onSelectionChanged - PullRequest
1 голос
/ 21 августа 2011

Возникли некоторые проблемы с chrome.tabs.onSelectionChanged.addListener.Все работает хорошо, пока не закроется все окно.Затем этот слушатель срабатывает ... по любой причине.Для меня это немного глючит, но в любом случае:

На этом слушателе я работаю с функцией chrome.tabs.get.И эта функция выдает ошибку в момент закрытия окна:

Error during tabs.get: No tab with id: 70.

Это имеет смысл.В данный момент вкладка больше не существует.У кого-нибудь уже был способ обойти это?Одной из возможных причин будет удаление слушателя при закрытии окна.Но, к сожалению, removeListener не работает (если кто-то знает, как удалить, я благодарен).

Best

EDIT 1.1: модифицированная функция из подхода Серга (спасибо затаким образом):

Сначала я попытался поймать только вкладки фактического окна с помощью: chrome.windows.getCurrent.Но эта функция не возвращает массив windows.tabs.Поэтому я сначала зачитываю текущий windows.id и перебираю только вкладки этого окна.

function ensureTabExists(tabId, callback) {
    chrome.windows.getCurrent(function(windows) {
        var exists = false;
        windowsId=windows.id;
        chrome.windows.getAll({populate: true}, function(windows){
            loop:
            for(var w=0;w<windows.length;++w) {
                if (windows[w].id == windowsId) {
                    for(var t=0;t<windows[w].tabs.length;++t){
                        if(windows[w].tabs[t].id == tabId) {
                            exists = true;
                            break loop;
                        }
                    }
                }
            }
            if(exists && callback) {
                callback();
            } 
        });
    });
}

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Вы можете просмотреть все вкладки во всех окнах и проверить, существует ли он по-прежнему:

function ensureTabExists(tabId, callback) {
    chrome.windows.getAll({populate: true}, function(windows){
        var exists = false;
        loop:
        for(w=0;w<windows.length;w++) {
            for(t=0;t<windows[w].tabs.length;t++){
                if(windows[w].tabs[t].id == tabId) {
                    exists = true;
                    break loop;
                }
            }
        }
        if(exists && callback) {
            callback();
        } 
    });
}

//usage
chrome.tabs.onSelectionChanged.addListener(function(tabId, selectInfo) {
    ensureTabExists(tabId, function(){
        //this code will run only if tab exists
    });
});
0 голосов
/ 21 августа 2011

Используйте chrome.window.onRemoved API для отслеживания закрытия окон. Таким образом, вы можете изящно обрабатывать окно закрытия окна.

...