«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как исправить ошибки «Контекст расширения недействителен», вызванные сценариями потерянного контента в расширениях Chrome?

Как исправить ошибки «Контекст расширения недействителен», вызванные сценариями потерянного контента в расширениях Chrome?

Опубликовано 8 ноября 2024 г.
Просматривать:167

How to Fix \

Как удалить потерянный скрипт после обновления расширения Chrome

Проблема

Непреднамеренная перезагрузка расширения Chrome, особенно в режиме разработчика, может привести к созданию потерянного контента сценарии. Эти сценарии продолжают работать в фоновом режиме, но теряют связь с остальной частью расширения, что приводит к таким ошибкам, как «контекст расширения недействителен» и «непроверенный runtime.lastError».

Решение

Осиротевший сценарий контента все еще может получать сообщения DOM. Чтобы удалить его:

1. Отправить сообщение из сценария нового содержимого:

  • В новом рабочем сценарии содержимого отправьте сообщение в потерянный сценарий с помощью window.dispatchEvent.
  • Используйте уникальный идентификатор сообщения , например orphanMessageId.

2. Отменить регистрацию прослушивателей в потерянном сценарии:

  • В потерянном сценарии определите прослушиватель для orphanMessageId.
  • В этом прослушивателе отмените регистрацию всех предыдущих прослушивателей и обнулите глобальные переменные.
  • Это делает старый скрипт пригодным для мусора коллекция.

3. Фоновый сценарий:

  • Повторно внедрите сценарий содержимого при перезагрузке/установке расширения.

4. Сценарий содержимого:

  • Используйте именованные функции для прослушивателей событий, чтобы сохранять их ссылки.
  • Установите свойство window.running, чтобы указать активный экземпляр.
  • При получении orphanMessageId отмените регистрацию прослушивателей и пометьте скрипт как осиротела.

5. Скрипт всплывающего окна:

  • Перед отправкой сообщений проверьте, присутствует ли рабочий скрипт содержимого.
  • Используйте SureContentScript, чтобы обеспечить внедрение скрипта.

Пример Код:

background.js:

// Re-inject content script
chrome.runtime.onInstalled.addListener(() => {
  chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
    chrome.tabs.executeScript(tabs[0].id, { file: 'content.js' });
  });
});

content.js:

// Orphaned script detection and cleanup
var orphanMessageId = chrome.runtime.id   'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// Register named listeners
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// Orphan flag and cleanup function
window.running = true;

function unregisterOrphan() {
  if (chrome.runtime.id) {
    // Not orphaned
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
}

popup.js:

async function sendMessage(data) {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  if (await ensureContentScript(tab.id)) {
    return await chrome.tabs.sendMessage(tab.id, data);
  }
}

async function ensureContentScript(tabId) {
  try {
    const [{ result }] = await chrome.scripting.executeScript({
      target: { tabId },
      func: () => window.running === true,
    });
    if (!result) {
      await chrome.scripting.executeScript({
        target: { tabId },
        files: ['content.js'],
      });
    }
    return true;
  } catch (e) {}
}
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3