Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Проблема с доступом к вкладке, от которой пришел request

Есть примерно такой код:
//это 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 для поиска таба (для успешного поиска таба стоит выработать какой-то критерий).

Комментариев нет:

Отправить комментарий