Как обновить/перезагрузить расширение Chrome?

Я разрабатываю расширение в Chrome 4 (в настоящее время 4.0.249.0), которое покажет репутацию пользователя StackOverflow/SuperUser/ServerFault в строке состояния. Я разработал страницу параметров, чтобы получить идентификаторы профиля пользователя, и я сохраняю их на localStorage и хорошо их читаю в расширении. Все отлично работает.
Проблема в том, что я не могу найти (программный) способ обновить расширение при сохранении опций. Я попытался позвонить location.reload(); с самой страницы расширения, щелкнув правой кнопкой мыши - безрезультатно. Я продолжил его и попытался посмотреть, что делает страница Chrome chrome://extensions/, чтобы перезагрузить расширение и нашел этот код:

/**
 * Handles a 'reload' button getting clicked.
 */
function handleReloadExtension(node) {
  // Tell the C++ ExtensionDOMHandler to reload the extension.
  chrome.send('reload', [node.extensionId]);
}

Копирование этого кода в обработчик событий не помогло (и да, я попытался заменить [node.extensionId] на фактический код). Может кто-то, пожалуйста, помогите мне сделать это правильно, или указывая на код расширения, который делает это правильно? Сделав это, я добавлю расширение и его источник в свой блог.

Ответ 1

Функция chrome.send недоступна вашим кодом расширения javascript, страницы, такие как страница newtab, история и страница расширений, используют его для связи с кодом контроллера С++ для этих страниц.

Вы можете перенаправить обновления своего расширения пользователям, которые его установили, это описано здесь. Пользовательское приложение будет обновляться после того, как будет удален интервал авторизации или перезапуск браузера. Однако вы не можете программно обновлять расширение пользователя. Я думаю, что это будет угроза безопасности.

Ответ 2

Теперь простейшим способом сделать расширение перезагрузить себя является вызов chrome.runtime.reload(). Эта функция не требует никаких разрешений в манифесте. Чтобы перезагрузить другое расширение, используйте chrome.management.setEnabled(). Он требует "разрешений": [ "management" ] в манифесте.

Ответ 3

У меня была такая же проблема с расширение.

Оказывается, вы можете прослушивать изменения хранилища в background.js с помощью chrome.storage.onChanged и выполнять эту логику обновления.

Например:

// Perform a reload any time the user clicks "Save"
chrome.storage.onChanged.addListener(function(changes, namespace) {
  chrome.storage.sync.get({
    profileId: 0
  }, function(items) {

    // Update status bar text here

  });
});

Вы также можете перезагрузить части своего расширения таким образом, принимая во внимание параметр changes. chrome.runtime.reload() может быть проще, но на это меньше накладных расходов.

Ответ 4

window.location.reload() работает для меня

Я использую хром 6.x, поэтому он может быть исправлен в более новой версии

Ответ 5

Для всех будущих пользователей Google - спецификация расширения браузера теперь включает runtime.reload() - https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/reload

Для Chrome вам может потребоваться использовать chrome.runtime.reload() (но я бы обработал такие случаи с помощью Mozilla awesome webextension-polyfill).