Search code examples
javascriptfirefoxsavefirefox-addonfirefox-addon-sdk

Save web pages with Firefox addon using file -> save as pop-up window


Let me start off by saying I am new to add-on development. Using the Add-on SDK, I am trying to create a simple Firefox add-on that, when a button is pressed, acts like pressing the Ctrl-S hotkey, or following the file -> save page as to get the save page pop up window. I have looked at similar questions on here, but they seem to be going around the built in save functions, and not utilizing the "save page as" window.

The end goal is to run other functions before the save call is made. The user will only see the save page window as normal.

I am unaware of ways to send hotkey signals, or accessing the file drop down menu from within an add-on.


Solution

  • One way to do this is to invoke the Save As dialog exactly as if the user had clicked on the "Save Page As..." menu item (id="menu_savePage"). You can do this by executing the doCommand() method of that menu item. The following assumes that the event passed in is the command event for the button that the user clicked.

    function launchSaveAsFromButton(event) {
    
        var window = event.view;
    
        //Create some common variables if they do not exist.
        //  This should work from any Firefox context.
        //  Depending on the context in which the function is being run,
        //  this could be simplified.
        if (window === null || typeof window !== "object") {
            //If you do not already have a window reference, you need to obtain one:
            //  Add a "/" to un-comment the code appropriate for your add-on type.
            //* Add-on SDK:
            var window = require('sdk/window/utils').getMostRecentBrowserWindow();
            //*/
            /* Overlay and bootstrap (from almost any context/scope):
            var window=Components.classes["@mozilla.org/appshell/window-mediator;1"]
                                 .getService(Components.interfaces.nsIWindowMediator)
                                 .getMostRecentWindow("navigator:browser");
            //*/
        }
        if (typeof document === "undefined") {
            //If there is no document defined, get it
            var document = window.content.document;
        }
        if (typeof gBrowser === "undefined") {
            //If there is no gBrowser defined, get it
            var gBrowser = window.gBrowser;
        }
    
        let menuSavePage = gBrowser.ownerDocument.getElementById("menu_savePage");
        menuSavePage.doCommand();
    }
    

    Finding out the ID for the "Save Page As..." dialog is made easier by using the DOM Inspector in combination with the add-on Element Inspector.