Есть примерно такой код:
//это background.js
//Сначала создаем вкладку
chrome.tabs.create({
'url':'...',
'active':false
},function(tab){
....
});
//Потом там происходят некие операции и оттуда приходит результат.
chrome.runtime.onMessage.addListener(function(request,sender,callback){
//тут куча кода
if(/*некое условие*/){
//тут вагон кода
chrome.tabs.remove(sender.tab.id);
//тут еще небольшая тележка
}else{
//тут тоже
chrome.tabs.update(sender.tab.id,{'url':url,'active':true});
//ну вы поняли.
}
}
На что при невыясненных мной до сих пор обстоятельствах порой прилетает такая ошибка (и на update, и на remove бывает):
Unchecked runtime.lastError while running tabs.update: No tab with id: некая цифра.
Случается довольно редко,но если начинается - то со всеми вкладками сразу (у меня по 7-10 их открыто). Вкладки при этом не закрываются/обновляются.
Если просто запустить всё заново или обновить вкладку - то всё опять работает. Повторюсь, мне ни разу не удалось искусственно это воспроизвести. Я пробовал открывать кучу вкладок,инкогнито, входить/выходить из аккаунта хрома, обновлять расширения, сворачивать браузер, переключатся между окнами,вкладками,отключать инет, ставил window.close() сразу после реквеста (всё во время тестовых реквестов с интервалом 10) - и ничего, воспроизвести так и не удалось. Отчего это случается и как с этим бороться?
Ответ
Первое, что могу посоветовать - это проверить, что id, на который ругается хром, есть в списке ids табов, созданных этим расширением. Т.е. в коллбеке метода chrome.tabs.create() запомнить куда-нибудь tab.id созданного таба, чтобы потом в случае возникновения ошибки вывести sender.tab.id и запомненный tabId. Это поможет понять направление, в сторону которого стоит копать.
Второе: есть небольшая вероятность, что с момента посылки сообщения до момента его получения tab.id изменился. В chrome.tabs API есть два метода, позволяющие отслеживать изменения tab.id. Советую повесить обработчики на события chrome.webNavigation.onTabReplaced и chrome.tabs.onReplaced. В случае, если перед ошибкой срабатывает один из этих обработчиков, значит дело именно в пререндеренге и прочих внутренних трюках хрома. Такую ситуацию нужно обрабатывать.
Втретьих: методы из списка chrome.tabs почти все асинхронные. remove и update - точно асинхронные. Поэтому есть некоторая вероятность того, что сообщение пришло из только что умершей вкладки.
В любом случае, существование вкладки нужно проверять, а также обрабатывать ситуацию недоступности вкладки по определенному id. Если таб нужен, а существующий id не подходит, можно воспользоваться методом chrome.tabs.query для поиска таба (для успешного поиска таба стоит выработать какой-то критерий).
Комментариев нет:
Отправить комментарий