Search code examples
javascriptfirefoxfirefox-addonfirefox-addon-restartless

firefox restartless bootstrap extension script not reloading


I am unable to get a source code modification reflected in the firefox extension without restarting firefox. I believe this should be possible when using the bootstrap approach.

Here is the source code:
bootstrap.js

var GOOGBAR_MODULES = [ "resource://googbar/loader.js"];

function startup(params, reason)
{

    var res = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
    var modulesURI = Services.io.newURI(__SCRIPT_URI_SPEC__ + "/../content/", null, null);
    res.setSubstitution("googbar", modulesURI);
    Cu.import("resource://googbar/loader.js");
} 


function shutdown(params, reason)
{ 
    // Unload all modules added with Cu.import
    GOOGBAR_MODULES.forEach(Cu.unload, Cu);

    // Clear our resource registration
    var res = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
    res.setSubstitution("googbar", null);

}

loader.js

console.log("googbar loader loaded");

when i change the message in the loader, it doesnt get reflected in firefox (version 30). I have a file "[email protected]" in the profile extensions folder which contains the path to my development folder. The changes I made to loader.js doesnt reflect when I enable/disable or remove/undo from the about:extensions page, unless i restart firefox. Any pointers to why the code is not loading dynamically would be helpful.

I am not interested in using the SDK for development. I have also set various flags as described in https://developer.mozilla.org/en-US/Add-ons/Setting_up_extension_development_environment

EDIT 1:

Here is a link to above code packaged as an xpi(1.35KB) i am using to test the scenario. https://www.dropbox.com/s/0io8b081ybu632q/test.xpi

EDIT 2:

My goal is to speed up the development process without having to restart the browser for every code change. Here is a related post, but seems to be an outdated one.


Solution

  • The AddonManager or more specifically the XPIProvider calls flushStartupCache but only when the add-on is uninstalled (incl. during up- and downgrades). However, the cache is not cleared when disabling or enabling an add-on in-session.

    • Either put an equivalent method in your bootstrap.js that you call when shutdown (you should do this in release versions).
    • Or just continue restating that damn browser. Personally I find it faster to just restart with the "Restartless Restart" add-on keyboard shortcut and roaming around in about:addons.

    PS: I can not be absolutely sure this is the only issue at play, since I cannot test your stuff, since you didn't provide a full, reproducible example.

    Edit Yes, indeed, adding the following to shutdown is sufficient and there are no other blocking issues:

    if (reason == ADDON_DISABLE) {
      Services.obs.notifyObservers(null, "startupcache-invalidate", null);
    }