20

I'm developing an extension in Chrome 4 (currently 4.0.249.0) that will show the user's StackOverflow/SuperUser/ServerFault reputation in the status bar. I've designed an options page to get the user's profile IDs and I save them to localStorage and read them well in the extension. It all works great.
The problem is I cannot find a (programmatic) way to refresh the extension upon options saving. I tried calling location.reload(); from the extension page itself upon right clicking it - to no avail. I pursued it further and tried looking at what Chrome's chrome://extensions/ page does to reload an extension, and found this code:

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

Copying this code to my event handler did not help (and yes, I tried replacing [node.extensionId] with the actual code). Can someone please assist me in doing this the right way, or pointing me at a code of an extension that does this correctly? Once done, I'll put the extension and its source up on my blog.

apaderno
  • 28,547
  • 16
  • 75
  • 90
Traveling Tech Guy
  • 27,194
  • 23
  • 111
  • 159

5 Answers5

48

Now the simplest way to make extension to reload itself is to call chrome.runtime.reload(). This feature doesn't need any permissions in manifest. To reload another extension use chrome.management.setEnabled(). It requires "permissions": [ "management" ] in manifest.

Konstantin Smolyanin
  • 17,579
  • 12
  • 56
  • 56
6

window.location.reload() works for me

I am using chromium 6.x so it might be fixed in newer version

Marek
  • 2,419
  • 6
  • 34
  • 38
5

The chrome.send function is not accessible by your extension's javascript code, pages like the newtab page, history and the extensions page use it to communicate with the C++ controller code for those pages.

You can push updates of your extension to users who have it installed, this is described here. The user's application will be updated once the autoupdate interval is hit or when they restart the browser. You cannot however reload a user's extension programmatically. I think that would be a security risk.

Pierre-Antoine LaFayette
  • 24,222
  • 8
  • 54
  • 58
  • Thanks Pierre. Solved my problem by alerting the user to click my extension, which cause a redraw. – Traveling Tech Guy Nov 19 '09 at 20:46
  • 6
    this question is kind of old, but now you can trigger reloads of extensions if you have access to the [extensions management API](http://code.google.com/chrome/extensions/management.html) – gengkev Jul 04 '12 at 00:46
  • security risk? we get poor developer experience instead. – bartek Sep 20 '16 at 13:01
3

I just had this same problem with an extension.

Turns out you can listen for storage changes within background.js using chrome.storage.onChanged and have that perform the refresh logic.

For example:

// 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

  });
});

You could also reload parts of your extension this way by taking the changes parameter into account. chrome.runtime.reload() might be easier, but this has less overhead.

Joe
  • 16,328
  • 12
  • 61
  • 75
2

For all future Googlers - the Browser Extension spec now includes runtime.reload() - https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/reload

For Chrome, you might need to use chrome.runtime.reload() (but I'd handle such cases via Mozilla's awesome webextension-polyfill).

kano
  • 5,626
  • 3
  • 33
  • 48