Using Firefox as a Thin-App for a Specific Web-Site
Objective:
Certain websites were coded to use features and be optimized for Mozilla?s Firefox Browser. These websites utilize strict W3C HTML components which do not render properly in Internet Explorer, or rely heavily on javascript code which runs sluggishly across all versions of Internet Explorer (and impacts the system performance in other applications). Due to the organization?s security policy, the only browser allowed is Internet Explorer. Firefox is specifically disallowed for the following reasons:
- Patching ? Firefox updates frequently (every 6 weeks) and as a result keeping it up to date creates support overhead for the various desktop teams.
- Management ? Firefox is not natively customizable through Group Policy, and Mozilla?s recommendation is to configure the browser through scripting. This conflicts with our existing management and DSO compliance policies.
- Compatibility ? If Firefox becomes the default browser on user machines, it may create compatibility issues with other apps that require Internet Explorer, specifically certain clinical applications.
- Testing ? All existing production applications have been tested against the enterprise standard browser. Compounding on previous compatibility concerns, existing production applications may have to undergo testing against an additional production scenario.
Some of the above mentioned concerns are mitigated with a modified installation of Firefox that prevents the user from opening other pages, navigating away from hard-coded URLs, and removing identifying information that the program is actually running inside Firefox. The procedure for creating such a Firefox Thin-App for a web-app is defined below.
Procedure:
- Create a folder on your machine as a workspace. In this folder, create 2 sub-folders, development (to be referred to as development) and production (to be referred to as production). For this guide, treat these italicized, underlined words as placeholders where you should replace the actual path!
- We will use Firefox portable for this purpose, as it does not write to the registry and thus can?t be addressed by the context menus of the system. Download the installer for Firefox Portable here: http://portableapps.com/apps/internet/firefox_portable, and install 2 instances of it, one in the development directory and one in the production directory.
- Firefox utilizes Profiles to contain custom configurations, and the profiles are persistent across other instances of Firefox. Because of profile persistence, we must force what we?re building to use a custom alternative profile, which will allow it to be functionally severely restricted while a separate installation of Firefox can function normally.
- Open a command prompt in Windows and execute "production\App\Firefox\firefox.exe ?p" replacing production with the path to the appropriate folder
- Select "Create Profile"
- Click Next
- Enter a profile name, preferably unique to your desired website.
- Navigate to production and create a directory with the profile name. (Please make note of this folder, which we?ll call "profiledir" in the rest of the guide).
- Click "Choose Folder" and navigate to your production directory, and create a directory with your profile name. (Please make note of this folder, which we?ll call "profiledir" in the rest of the guide).
- Click Finish
- Select the "default" profile and delete it.
- Make sure "Don?t ask at startup" is checked.
- Double-click the new profile to launch Firefox with this profile.
- In the production directory, create a blank text file called "FirefoxPortable.ini" and put the following text in it, making sure to edit the third line based on the profile created in step 3:
- [FirefoxPortable]
- FirefoxDirectory=App\firefox
- profiledirectory=profiledir Relative to production
- PluginsDirectory=Data\plugins
- SettingsDirectory=Data\settings
- FirefoxExecutable=firefox.exe
- AdditionalParameters=
- LocalHomepage=
- DisableSplashScreen=true
- DisableIntelligentStart=false
- AllowMultipleInstances=true
- SkipChromeFix=false
- SkipCompregFix=false
- WaitForFirefox=false
- RunLocally=true
- Download the add-on (hosted below) "keyconfig" found at: http://mozilla.dorando.at/keyconfig.xpi and place it in the "production\Data\plugins" folder. If the directory is not there, create it.
- Run your production instance of Firefox portable (production\FirefoxPortable.exe) (If it prompts you to make it your default browser, decline and uncheck the box)
- Click the Firefox button in the upper-left, and navigate the menu to "Add-ons"
- Click the gear in the upper-right area, select "Install Add-On From File?", navigate to your "production\Data\plugins" folder and select the keyconfig add-on.
- Install the add-on, and restart Firefox.
- When Firefox re-opens, just as above, navigate to the Add-Ons panel, and select "Extensions" on the left. Locate "keyconfig" and click "Options".
- Disable ALL key bindings EXCEPT the following:
- Browser:Reload
- Close Tab (Only if you require multiple tabs!)
- Copy
- Cut
- Delete
- Full Screen
- New Tab (Only if you require multiple tabs!)
- Paste
- Print?
- Redo
- Reset [Zoom]
- Select All
- Stop
- Zoom In [Zoom]
- Zoom Out [Zoom]
- Our organization required that we restrict access to url's not needed by the use-case; as a result we used a plugin to implement a URL whitelist. To do this, we installed a plugin called "Block Site." Click the Firefox button in the upper left, navigate to Add-Ons, and search for "Block Site." The version at writing is 1.1.8, and it's hosted below, but available here: https://addons.mozilla.org/en-US/firefox/addon/blocksite/ If you install it from file, follow the same procedure above from keyconfig.
- Once the Block Site Add-On is installed, you will have to restart Firefox. When Firefox re-opens, just as above, navigate to the Add-Ons panel, and select "Extensions" on the left. Locate "Block Site" and click "Options".
- Our organization opted for a "whitelist" but this can be configured multiple ways; I intend to share the configuration we used, but feel free to make changes as needed. Please note, changes to this configuration need to be reflected below when you get to editing the prefs.js file:
- CHECK "Enable BlockSite"
- UNCHECK "Enable warning messages"
- Select the "whitelist" radio button.
- For each entry needed in the white/black list, click "add" below. Wildcards are allowed.
- Once all sites are added, click "OK"
- Now, we will rebrand Firefox for our application, to obfuscate to the user that they are using a modified Firefox browser. This can be done in the actual application, however I recommend using the development instance for this. Start the development instance of firefox (development\FirefoxPortable.exe)
- Click the Firefox button in the upper left, navigate to Add-Ons, and search for "Rebrand." The version at writing is 1.3, and it's hosted below, but available here: https://addons.mozilla.org/en-US/firefox/addon/rebrand/?src=api If you install it from file, follow the same procedure above from keyconfig.
- Once the Rebrand Add-On is installed, you will have to restart Firefox. In the Firefox menu in the upper left, navigate to the "Web development" sub-menu, and select "Rebranding Wizard"
- This add-on contains a wizard which will produce another add-on (in the format of a .xpi file) which, when installed, completely rebrands the application, replacing graphics and text. For this step, you will need to create the following assets in advance:
- About Image: 300x236 px PNG
- About Credits: 300x149 px PNG
- Branded Wizards: 48x48 px PNG
- Mac Notifications: 64x64 px PNG
- Start page favicon: 16x16 px PNG
- About Logo: 210x210 px PNG
- About Wordmark: 130x38 px PNG
- Windows Icon: .ico format
- 48x48 True Color
- 32x32 True Color
- 16x16 True Color
- 48x48 256 Color
- 32x32 256 Color
- 16x16 256 Color
- Proceed through the wizard, completing all fields as requested. Pay attention to the filename you choose for the .xpi
- When you have completed the wizard, wherever you choose to save the .xpi file, move it to "production\Data\Plugins"
- Open your instance of Firefox in "production\FirefoxPortable.exe". Click the Firefox button in the upper left, navigate to "Add-Ons" and select the gear in the upper-right area, select "Install Add-On From File?", navigate to your "production\Data\Plugins" folder and select the new .xpi you created. Install this add-on and restart Firefox; you should see the modified branding.
- Should you need to make branding changes, simply repeat the process and generate another .xpi.
- Firefox contains a configuration console when you type the URL "about:config" into the address bar. Changes from the defaults are stored in the "production\profiledir\prefs.js" (or wherever you made the profile directory above). The following are the changes we used in our configuration; note this file will revert to its original state if it is edited while Firefox is open. Either make the following changes in the "about:config" console, or close all Firefox instances and edit the file directly. The most important change below is printed in Red and highlighted in yellow; this will be the URL the browser automatically browses to:
- # Mozilla User Preferences
- user_pref("accessibility.typeaheadfind.flashBar", 0);
- user_pref("app.update.auto", false);
- user_pref("app.update.enabled", false);
- user_pref("app.update.migrated.updateDir", true);
- user_pref("app.update.service.enabled", false);
- user_pref("browser.cache.disk.capacity", 0);
- user_pref("browser.cache.disk.smart_size.enabled", false);
- user_pref("browser.cache.disk.smart_size.first_run", false);
- user_pref("browser.download.panel.firstSessionCompleted", true);
- user_pref("browser.download.panel.shown", true);
- user_pref("browser.download.useDownloadDir", false);
- user_pref("browser.formfill.enable", false);
- user_pref("browser.link.open_newwindow", 2);
- user_pref("browser.migration.version", 13);
- user_pref("browser.newtabpage.enabled", false);
- user_pref("browser.newtab.url", "http://remedy/");
- user_pref("browser.newtabpage.storageVersion", 1);
- user_pref("browser.pagethumbnails.storage_version", 3);
- user_pref("browser.places.importBookmarksHTML", false);
- user_pref("browser.places.smartBookmarksVersion", 4);
- user_pref("browser.preferences.advanced.selectedTabIndex", 4);
- user_pref("browser.rights.3.shown", true);
- user_pref("browser.search.suggest.enabled", false);
- user_pref("browser.sessionstore.restore_on_demand", false);
- user_pref("browser.shell.checkDefaultBrowser", false);
- user_pref("browser.slowStartup.averageTime", 836);
- user_pref("browser.slowStartup.samples", 3);
- user_pref("browser.startup.homepage", "http://");
- user_pref("browser.startup.homepage_override.buildID", "20130910160258");
- user_pref("browser.startup.homepage_override.mstone", "24.0");
- user_pref("browser.syncPromoViewsLeftMap", "{\"passwords\":0,\"addons\":2}");
- user_pref("browser.tabs.autoHide", true);
- user_pref("browser.tabs.warnOnClose", false);
- user_pref("browser.tabs.warnOnOpen", false);
- user_pref("browser.taskbar.lists.enabled", false);
- user_pref("browser.taskbar.lists.frequent.enabled", false);
- user_pref("browser.taskbar.lists.tasks.enabled", false);
- user_pref("browser.urlbar.autoFill", false);
- user_pref("browser.urlbar.autoFill.typed", false);
- user_pref("browser.urlbar.autocomplete.enabled", false);
- user_pref("datareporting.healthreport.service.firstRun", true);
- user_pref("datareporting.healthreport.uploadEnabled", false);
- user_pref("datareporting.policy.dataSubmissionPolicyAccepted", false);
- user_pref("dom.disable_open_during_load", false);
- user_pref("dom.mozApps.used", true);
- user_pref("extensions.BlockSite.authenticate", false);
- user_pref("extensions.BlockSite.enabled", true);
- user_pref("extensions.BlockSite.listtype", "whitelistRadio");
- user_pref("extensions.BlockSite.removeLinks", false);
- user_pref("extensions.BlockSite.showWarning", false);
- user_pref("extensions.BlockSite.whitelist", "");
- user_pref("extensions.BlockSite.whitelistDesc", "");
- user_pref("extensions.blocklist.enabled", false);
- user_pref("extensions.blocklist.pingCountTotal", 7);
- user_pref("extensions.blocklist.pingCountVersion", 2);
- user_pref("extensions.bootstrappedAddons", "{}");
- user_pref("extensions.databaseSchema", 14);
- user_pref("extensions.lastAppVersion", "24.0");
- user_pref("extensions.lastPlatformVersion", "24.0");
- user_pref("extensions.pendingOperations", false);
- user_pref("extensions.shownSelectionUI", true);
- user_pref("extensions.ui.dictionary.hidden", true);
- user_pref("extensions.ui.lastCategory", "addons://list/extension");
- user_pref("extensions.ui.locale.hidden", true);
- user_pref("extensions.update.autoUpdateDefault", false);
- user_pref("extensions.wips.client","e52ef90b-cdb5-8259-721b-0aea78a53ad6");
- user_pref("extensions.wips.stats_permission.a00112",false);
- user_pref("extensions.wips.extension_id.a00112",true);
- user_pref("extensions.wips.preferences.a00112.setup_lang","1383061230554");
- user_pref("extensions.wips.preferences.a00112.install_date","1382579510945");
- user_pref("extensions.wips.preferences.a00112.version","1.1.8");
- user_pref("extensions.wips.stats.lock","");
- user_pref("extensions.wips.stats.current_false_url","");
- user_pref("extensions.wips.stats.last_false_url","");
- user_pref("extensions.wips.stats.reglock","c6273c81-35da-15c5-73b5-7cba89ec4492");
- user_pref("extensions.wips.stats.every_url_lock","");
- user_pref("extensions.wips.preferences.a00112.pref_prefix_change",true);
- user_pref("extensions.wips.preferences.a00112.special_thanks",false);
- user_pref("extensions.wips.preferences.a00112.special_thanks_time","1383061230554");
- user_pref("extensions.wips.preferences.a00112.stats_status_timeout","1382579510945");
- user_pref("gecko.buildID", "20130910160258");
- user_pref("gecko.mstone", "24.0");
- user_pref("general.warnOnAboutConfig", false);
- user_pref("intl.charsetmenu.browser.cache", "windows-1252, UTF-8");
- user_pref("keyconfig.global.20110522", "");
- user_pref("keyconfig.main.addBookmarkAsKb", "!][][");
- user_pref("keyconfig.main.bookmarkAllTabsKb", "!][][");
- user_pref("keyconfig.main.focusChatBar", "!][][");
- user_pref("keyconfig.main.focusURLBar", "!][][");
- user_pref("keyconfig.main.focusURLBar2", "!][][");
- user_pref("keyconfig.main.goBackKb", "!][][");
- user_pref("keyconfig.main.goForwardKb", "!][][");
- user_pref("keyconfig.main.goHome", "!][][");
- user_pref("keyconfig.main.key_browserConsole", "!][][");
- user_pref("keyconfig.main.key_closeWindow", "!][][");
- user_pref("keyconfig.main.key_devToolbar", "!][][");
- user_pref("keyconfig.main.key_find", "!][][");
- user_pref("keyconfig.main.key_findAgain", "!][][");
- user_pref("keyconfig.main.key_findPrevious", "!][][");
- user_pref("keyconfig.main.key_gotoHistory", "!][][");
- user_pref("keyconfig.main.key_inspector", "!][][");
- user_pref("keyconfig.main.key_jsdebugger", "!][][");
- user_pref("keyconfig.main.key_jsprofiler", "!][][");
- user_pref("keyconfig.main.key_keyconfig", "!][][");
- user_pref("keyconfig.main.key_netmonitor", "!][][");
- user_pref("keyconfig.main.key_newNavigator", "!][][");
- user_pref("keyconfig.main.key_openAddons", "!][][");
- user_pref("keyconfig.main.key_openDownloads", "!][][");
- user_pref("keyconfig.main.key_privatebrowsing", "!][][");
- user_pref("keyconfig.main.key_responsiveUI", "!][][");
- user_pref("keyconfig.main.key_sanitize", "!][][");
- user_pref("keyconfig.main.key_savePage", "!][][");
- user_pref("keyconfig.main.key_scratchpad", "!][][");
- user_pref("keyconfig.main.key_search", "!][][");
- user_pref("keyconfig.main.key_search2", "!][][");
- user_pref("keyconfig.main.key_selectLastTab", "!][][");
- user_pref("keyconfig.main.key_selectTab1", "!][][");
- user_pref("keyconfig.main.key_selectTab2", "!][][");
- user_pref("keyconfig.main.key_selectTab3", "!][][");
- user_pref("keyconfig.main.key_selectTab4", "!][][");
- user_pref("keyconfig.main.key_selectTab5", "!][][");
- user_pref("keyconfig.main.key_selectTab6", "!][][");
- user_pref("keyconfig.main.key_selectTab7", "!][][");
- user_pref("keyconfig.main.key_selectTab8", "!][][");
- user_pref("keyconfig.main.key_showAllTabs", "!][][");
- user_pref("keyconfig.main.key_styleeditor", "!][][");
- user_pref("keyconfig.main.key_switchTextDirection", "!][][");
- user_pref("keyconfig.main.key_tabview", "!][][");
- user_pref("keyconfig.main.key_toggleAddonBar", "!][][");
- user_pref("keyconfig.main.key_undoCloseTab", "!][][");
- user_pref("keyconfig.main.key_undoCloseWindow", "!][][");
- user_pref("keyconfig.main.key_viewSource", "!][][");
- user_pref("keyconfig.main.key_webconsole", "!][][");
- user_pref("keyconfig.main.manBookmarkKb", "!][][");
- user_pref("keyconfig.main.markPage", "!][][");
- user_pref("keyconfig.main.openFileKb", "!][][");
- user_pref("keyconfig.main.showAllHistoryKb", "!][][");
- user_pref("keyconfig.main.viewBookmarksSidebarKb", "!][][");
- user_pref("keyconfig.main.viewBookmarksSidebarWinKb", "!][][");
- user_pref("keyconfig.main.xxx_key24_cmd_handleBackspace", "!][][");
- user_pref("keyconfig.main.xxx_key25_cmd_handleShiftBackspace", "!][][");
- user_pref("keyconfig.main.xxx_key31_Browser:ReloadSkipCache", "!][][");
- user_pref("keyconfig.main.xxx_key32_Browser:FocusNextFrame", "!][][");
- user_pref("keyconfig.main.xxx_key33_Browser:FocusNextFrame", "!][][");
- user_pref("keyconfig.main.xxx_key36_Browser:ReloadSkipCache", "!][][");
- user_pref("keyconfig.main.xxx_key41_cmd_findAgain", "!][][");
- user_pref("network.cookie.prefsMigrated", true);
- user_pref("pdfjs.migrationVersion", 1);
- user_pref("pdfjs.previousHandler.alwaysAskBeforeHandling", true);
- user_pref("pdfjs.previousHandler.preferredAction", 4);
- user_pref("places.history.expiration.transient_current_max_pages", 101969);
- user_pref("plugin.disable_full_page_plugin_for_types", "application/pdf");
- user_pref("plugin.importedState", true);
- user_pref("plugin.scan.plid.all", true);
- user_pref("plugins.notifyMissingFlash", false);
- user_pref("privacy.cpd.offlineApps", true);
- user_pref("privacy.sanitize.migrateFx3Prefs", true);
- user_pref("services.sync.globalScore", 0);
- user_pref("services.sync.migrated", true);
- user_pref("urlclassifier.keyupdatetime.https://sb-ssl.google.com/safebrowsing/newkey", 1384094802);
- user_pref("xpinstall.whitelist.add", "");
- user_pref("xpinstall.whitelist.add.180", "");
- user_pref("xpinstall.whitelist.add.36", "");
- SHOULD YOU REQUIRE WHITELISTING make sure to edit the following lines with the names and descriptions of your whitelisted sites. Entries should be separated by "|||" without quotes, and even if you don't want a description add a separator:
- user_pref("extensions.BlockSite.whitelist", "");
- user_pref("extensions.BlockSite.whitelistDesc", "");
- SHOULD YOU WANT DIFFERENT CONFIGURATIONS TO BLOCK SITE make sure to edit the following lines with the correct configuration options you desire:
- user_pref("extensions.BlockSite.authenticate", false);
- user_pref("extensions.BlockSite.enabled", true);
- user_pref("extensions.BlockSite.listtype", "whitelistRadio");
- user_pref("extensions.BlockSite.removeLinks", false);
- user_pref("extensions.BlockSite.showWarning", false);
- SHOULD YOUR USERS REQUIRE MULTIPLE TABS: Add the following line to the above prefs.js file, changing the URL to the same URL you entered in the previous step:
- user_pref("browser.newtab.url", "http://");
- SHOULD YOUR USERS REQUIRE MULTIPLE TABS: Remove the following line from the above prefs.js file:
- user_pref("keyconfig.main.key_close", "!][][");
- user_pref("keyconfig.main.key_newNavigatorTab", "!][][");
- Firefox uses a Document Object Model to control visual elements in its UI, and as a result we can hide UI elements through a custom css file. In the profiledir directory inside production make a folder called "chrome". Inside this folder, make a file called "userChrome.css" and paste the following into it:
- Should your users only require 1 tab:
- @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); /* only needed once */
- menubar > menu,
- #appmenu-popup,
- #blocksite-firebirdcontextmenuitem,
- #context-openlinkintab ,
- #context-openlink,
- #context-viewsource ,
- #context-viewinfo,
- #context-metadata ,
- #context-bookmarkpage,
- #context-back,
- #context-forward,
- #context-savepage,
- #context-viewbgimage,
- #context-inspect,
- #context-sep-open,
- #context-sep-copylink,
- #context-sep-copyimage,
- #context-sep-stop,
- #context-sep-viewbgimage,
- #context-sep-undo,
- #context-sep-paste,
- #context-sep-selectall,
- #context-sep-properties,
- #context-sep-bidi
- #editBookmarkPanel,
- #find-field-container,
- #frame-sep,
- #nav-bar,
- #new-tab-button,
- #openLocation ,
- #search-container,
- #sidebar,
- #sidebar-title,
- tab,
- #tabs-closebutton ,
- .tabs-newtab-button,
- #toolbarbutton ,
- #toolbar-menubar ,
- #urlbar-container,
- {
- display:none!important;
- }
- Should your users require multiple tabs:
- @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); /* only needed once */
- menubar > menu,
- #appmenu-popup,
- #blocksite-firebirdcontextmenuitem,
- #context-back,
- #context-bookmarklink,
- #context-bookmarkpage,
- #context-forward,
- #context-inspect,
- #context-metadata,
- #context-openlink,
- #context-openlinkintab,
- #context-openlinkprivate,
- #context-savepage,
- #context-searchselect,
- #context-sendimage,
- #context-sep-bidi,
- #context-sep-copylink,
- #context-sep-copyimage,
- #context-sep-open,
- #context-sep-paste,
- #context-sep-properties,
- #context-sep-stop,
- #context-sep-undo,
- #context-sep-viewbgimage,
- #context-sep-selectall,
- #context-setDesktopBackground,
- #context-viewbgimage,
- #context-viewimage,
- #context-viewimageinfo,
- #context-viewinfo,
- #context-viewsource,
- #context-viewpartialsource-selection,
- #editBookmarkPanel,
- #find-field-container,
- #frame,
- #frame-sep,
- #nav-bar,
- #openLocation,
- #search-container,
- #sidebar,
- #sidebar-title,
- #tabContextMenu,
- #toolbar-context-menu,
- #toolbar-menubar,
- #toolbarbutton,
- #urlbar-container
- {
- display:none!important;
- }
- Should your users only require 1 tab:
- Save the file and close it. Note; this file is the last step in cutting off Firefox control options; should you need to make a change to the configuration, disabling this change will bring back missing UI elements.
- OPTIONAL: It is possible to embed plugins such as flash or shockwave into this installation. The program WILL check for compatible plugins on the system, and if it doesn?t find them, fall back to an embedded plugin. Simply add the plugin file to "production\Data\plugins" and it should appear. Should you not wish to have the app search the system for plugins, simply delete the following line from the prefs.js file:
- user_pref("plugin.scan.plid.all", true);
- Close all instances of Firefox, and rename the "production\FirefoxPortable.exe" to another name. When deployed, a shortcut will point to this .exe file, and the icon of the shortcut will be the icon created above.
- OPTIONAL: It may be prudent to obfuscate the actuall running executable name and icon from the user, so that it shows up differently in task manager.
- Download and install "Resource Hacker" from this site: http://www.angusj.com/resourcehacker/ (Also hosted below)
- Navigate to "production\App\Firefox\", right click "firefox.exe" and choose "Open Using Resource Hacker"
- Navigate to the "Action" menu and choose "Replace Icon"
- Click "Open file with new icon" and choose the icon file you made when rebranding the application.
- Select the icon in the right hand menu to replace, and hit "replace."
- Repeat this process for all icons in the executable.
- Returning to the main Resource Hacker window, expand the menu entries in the tree on the left, and choose the deepest entries which have a flower icon (this tree changes for each application).
- Edit any metadata in any of the scripts, removing any Firefox data you need.
- Each time you edit a script, click the "Compile Script" button to execute the change.
- Should you wish to rename the actual .exe file, make sure to reflect that change in any lines that reference the filename.
- When finished, return to the "File" menu at the top and save the file. Then close the application.
- Rename the .exe file, if you chose to change it.
- Open the file you created in step 4 (FirefoxPortable.ini) and replace the name of the .exe
- OPTIONAL: The following directories and files can be deleted from the production folder:
- production\help.html
- production\Other\*
- production\App\AppInfo\*
- production\App\DefaultData\*
- production\App\readme.txt
- At deployment, the following concerns must be noted:
- There is no registration required; the files simply must be deployed to a folder on the machine.
- There is no way to change the icon of the actual exe, however the shortcut pointing to the program should utilize the icon created above.
- The shortcut to the executable needs to use a modified appID in order to hide the firefox pin menu in Windows 7. This can be done by editing the path of the shortcut and adding ' -appĂd "App Name"' to the end.
- The user should not have rights to edit the final "production\profiledir\prefs.js" file
- The user should not have rights to edit the final "production\profiledir\chrome\userChrome.css" file.
Files:
- Firefox Portable v24
- Keyconfig Firefox Plugin
- Rebrand Firefox Plugin
- Block Site Firefox Plugin
- Resource Hacker Installation