Как избежать ошибок «Недопустимый контекст расширения» при обмене сообщениями ПОСЛЕ обновления расширения? - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь создать плавный опыт для пользователей моего расширения Chrome после выпуска обновлений.

Я повторно внедряю сценарий содержимого при обновлении приложения, и моя функциональность работает, даже если пользователь продолжаетиспользовать мое расширение на странице, которая НЕ была обновлена ​​после обновления расширения.Обновление страницы - идеальное решение, но я не хочу навязывать это своим пользователям.

Однако в консоли скрипта контента (на странице, в которую вставляется скрипт контента) появляются следующие ошибки ПОСЛЕРасширение обновляется, но ДО обновления страницы, когда мой код пытается отправить сообщение со скрипта / страницы содержимого на мою фоновую страницу:

Uncaught Ошибка: контекст расширения недействителен.

Есть ли способ «восстановить» соединение?Я пробовал долгоживущий порт и обычный обмен сообщениями - обновление Расширения имеет тот же эффект.

Любые идеи / направления приветствуются.

Вот мой простой код сообщения (в скрипте содержимого), который выдает ошибку ... но МОЖЕТ связаться с фоновым скриптом:

chrome.runtime.sendMessage({ msg: "recordFeedback", obj: commentObj, source: source}, function(response){
  console.log('Sent to DB...response was: ', response, response.recordFeedbackResponse);
});

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Когда расширение выгружается, существующие скрипты контента теряют связь с остальной частью расширения - то есть порты закрываются, и они не смогут использовать runtime.sendMessage() - но сами скрипты контента все еще продолжают работать, так как ониуже введены в их страницы.

То же самое, когда расширение перезагружается: эти существующие скрипты контента все еще будут присутствовать, но не смогут отправлять сообщения;Попытки сделать это вызывают ошибки, подобные той, с которой вы столкнулись.Кроме того, поскольку расширения обычно внедряют свои скрипты контента в существующие вкладки при их загрузке (в Chrome - Firefox делает это автоматически), у вас будет более одной копии скрипта контента, запущенного на данной вкладке:оригинальный, теперь отключенный и текущий, подключенный.

Могут возникнуть проблемы, если: (1) ваш оригинальный контент-скрипт все еще пытается связаться с остальной частью расширения или (2) ваш оригинальныйСценарий содержимого выполняет такие вещи, как изменение DOM, так как вы можете получить эти изменения несколько раз.

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

Это перефразировало некоторую полезную справочную информацию, которую я нашел, когда ранее исследовал эту проблему .Обратите внимание, что Firefox автоматически выгружает скрипты контента (подробнее об этом позже).

Решения

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

Вот некоторая дополнительная информация и советы, особенно полезные, если вы внедряете новые сценарии содержимого и хотите отключить исходный, отключенный, один, когда вводится новый .

Независимо от того, хотите ли вы попытаться восстановить соединение, используя существующий сценарий содержимого, или остановить выполнение исходного сценария содержимогоДля дальнейших изменений и добавления нового вам необходимо обнаружить, что произошла выгрузка.Вы можете использовать обработчик порта disconnect, чтобы поймать, когда ваше расширение выгружено.Если ваше расширение использует только простую однократную передачу сообщений, а не порты, то этот код так же прост, как и запуск следующего при запуске скрипта контента (я впервые увидел эту технику в некотором коде из lydell ).

browser.runtime.connect().onDisconnect.addListener(function() {
    // clean up when content script gets disconnected
})

В Firefox порт disconnect не запускается , поскольку сценарии содержимого удаляются до того, как они его получат.Преимущество этого заключается в том, что это обнаружение не является необходимым (равно как и ручное внедрение сценариев содержимого, так как сценарии содержимого также вводятся автоматически), но это означает, что нет никакой возможности сбросить любые изменения, внесенные в DOM вашим сценарием содержимого, когда онбежал.

0 голосов
/ 18 февраля 2019
if(typeof chrome.app.isInstalled!=='undefined'){
   chrome.runtime.sendMessage()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...