File firefox-ui-lockdown.patch of Package firefox2
diff --git a/browser/base/content/browser-context.inc b/browser/base/content/browser-context.inc
index 72fd054..9ba68a1 100644
--- a/browser/base/content/browser-context.inc
+++ b/browser/base/content/browser-context.inc
@@ -202,14 +202,17 @@
<menuitem label="&bookmarkFrameCmd.label;"
accesskey="&bookmarkFrameCmd.accesskey;"
oncommand="gContextMenu.addBookmarkForFrame();"/>
- <menuitem label="&saveFrameCmd.label;"
+ <menuitem id="context-saveframe"
+ label="&saveFrameCmd.label;"
accesskey="&saveFrameCmd.accesskey;"
oncommand="saveDocument(gContextMenu.target.ownerDocument);"/>
<menuseparator/>
- <menuitem label="&viewFrameSourceCmd.label;"
+ <menuitem id="context-viewframesource"
+ label="&viewFrameSourceCmd.label;"
accesskey="&viewFrameSourceCmd.accesskey;"
oncommand="gContextMenu.viewFrameSource();"/>
- <menuitem label="&viewFrameInfoCmd.label;"
+ <menuitem id="context-viewframeinfo"
+ label="&viewFrameInfoCmd.label;"
accesskey="&viewFrameInfoCmd.accesskey;"
oncommand="gContextMenu.viewFrameInfo();"/>
</menupopup>
diff --git a/browser/base/content/browser-menubar.inc b/browser/base/content/browser-menubar.inc
index bcf9109..0be18ad 100644
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -55,9 +55,9 @@
<menuitem id="menu_saveFrame" label="&saveFrameCmd.label;" accesskey="&saveFrameCmd.accesskey;" command="Browser:SaveFrame" hidden="true"/>
<menuitem id="menu_sendLink" label="&sendPageCmd.label;" accesskey="&sendPageCmd.accesskey;" command="Browser:SendLink"/>
<menuseparator/>
- <menuitem label="&printSetupCmd.label;" accesskey="&printSetupCmd.accesskey;" command="cmd_pageSetup"/>
+ <menuitem id="menu_printSetup" label="&printSetupCmd.label;" accesskey="&printSetupCmd.accesskey;" command="cmd_pageSetup"/>
#ifndef XP_MACOSX
- <menuitem label="&printPreviewCmd.label;" accesskey="&printPreviewCmd.accesskey;" command="cmd_printPreview"/>
+ <menuitem id="menu_printPreview" label="&printPreviewCmd.label;" accesskey="&printPreviewCmd.accesskey;" oncommand="PrintUtils.printPreview(onEnterPrintPreview, onExitPrintPreview);"/>
#endif
<menuitem label="&printCmd.label;" accesskey="&printCmd.accesskey;" key="printKb" command="cmd_print"/>
<menuseparator/>
@@ -458,7 +458,7 @@
#endif
label="&bookmarkAllCmd.label;"
command="Browser:BookmarkAllTabs"/>
- <menuitem key="manBookmarkKb"
+ <menuitem id="manBookmark" key="manBookmarkKb"
label="&manBookmarksCmd.label;"
oncommand="toOpenWindowByType('bookmarks:manager', 'chrome://browser/content/bookmarks/bookmarksManager.xul');"/>
<menuseparator/>
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 3126883..906fa00 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -288,7 +288,7 @@ function UpdateBookmarkAllTabsMenuitem()
numTabs = tabbrowser.tabContainer.childNodes.length;
var bookmarkAllCommand = document.getElementById("Browser:BookmarkAllTabs");
- if (numTabs > 1)
+ if (numTabs > 1 && !gPrefService.getBoolPref("config.lockdown.bookmark"))
bookmarkAllCommand.removeAttribute("disabled");
else
bookmarkAllCommand.setAttribute("disabled", "true");
@@ -934,6 +934,150 @@ function prepareForStartup()
BrowserSearch.init();
}
+function lockdownElement(ident, disable, hideCompletely)
+{
+ var e = document.getElementById(ident);
+ if (!e) return;
+ if (hideCompletely) {
+ e.setAttribute("style", (disable) ? "display: none;" : "");
+ } else if (disable) {
+ e.setAttribute("disabled", "true");
+ } else {
+ e.removeAttribute("disabled");
+ }
+}
+
+function applyLockdown(isStartup)
+{
+ // It is important to check that Firefox code does not change the
+ // "disabled" state of these UI elements. Fortunately it mostly hides
+ // elements rather than disables them.
+ var disablePrinting = gPrefService.getBoolPref("config.lockdown.printing");
+ var disablePrintSetup = gPrefService.getBoolPref("config.lockdown.printsetup");
+ if (!isStartup || disablePrintSetup || disablePrintSetup) {
+ lockdownElement("menu_printSetup", disablePrinting || disablePrintSetup);
+ lockdownElement("menu_printPreview", disablePrinting || disablePrintSetup);
+ lockdownElement("cmd_print", disablePrinting);
+ }
+
+ var disableSave = gPrefService.getBoolPref("config.lockdown.savepage");
+ if (!isStartup || disableSave) {
+ lockdownElement("Browser:SavePage", disableSave);
+ lockdownElement("Browser:SaveFrame", disableSave);
+ lockdownElement("context-savepage", disableSave);
+ lockdownElement("context-saveframe", disableSave);
+ lockdownElement("context-savelink", disableSave);
+ lockdownElement("context-saveimage", disableSave);
+ lockdownElement("View:PageSource", disableSave);
+ lockdownElement("context-viewpartialsource-selection", disableSave);
+ lockdownElement("context-viewpartialsource-mathml", disableSave);
+ lockdownElement("context-viewsource", disableSave);
+ lockdownElement("context-viewframesource", disableSave);
+ lockdownElement("View:PageInfo", disableSave);
+ lockdownElement("context-viewinfo", disableSave);
+ lockdownElement("context-viewframeinfo", disableSave);
+ lockdownElement("Tasks:InspectPage", disableSave); // from DOMInspector extension
+ }
+
+ var disableBookmarks = gPrefService.getBoolPref("config.lockdown.hidebookmark");
+ var disableBookmarkEditing = gPrefService.getBoolPref("config.lockdown.bookmark");
+ if (!isStartup || disableBookmarks || disableBookmarkEditing) {
+ lockdownElement("bookmarks-menu", disableBookmarks, true);
+ lockdownElement("viewBookmarksSidebar", disableBookmarks);
+ lockdownElement("PersonalToolbar", disableBookmarks); // XXX check
+ lockdownElement("Browser:AddBookmarkAs", disableBookmarks || disableBookmarkEditing);
+ lockdownElement("manBookmark", disableBookmarks || disableBookmarkEditing);
+ lockdownElement("context-bookmarkpage", disableBookmarks || disableBookmarkEditing);
+ lockdownElement("context-bookmarklink", disableBookmarks || disableBookmarkEditing);
+
+ // hide the personal bookmarks toolbar if necessary
+ if (disableBookmarks) {
+ document.getElementById("PersonalToolbar").setAttribute("collapsed", "true");
+ }
+ }
+
+ var disableHistory = gPrefService.getBoolPref("config.lockdown.history");
+ if (!isStartup || disableHistory) {
+ lockdownElement("go-menu", disableHistory, true);
+ lockdownElement("viewHistorySidebar", disableHistory);
+ gURLBar.setAttribute("enablehistory", disableHistory ? "false" : "true");
+ gURLBar.disableAutoComplete = disableHistory;
+ }
+
+ var defaultPrefs = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefService).getDefaultBranch(null);
+ if (isStartup && disableHistory) {
+ if (!defaultPrefs.prefIsLocked("browser.history_expire_days")) {
+ defaultPrefs.setIntPref("browser.history_expire_days", 0);
+ defaultPrefs.lockPref("browser.history_expire_days");
+ }
+ if (!defaultPrefs.prefIsLocked("browser.formfill.enable")) {
+ defaultPrefs.setBoolPref("browser.formfill.enable", false);
+ defaultPrefs.lockPref("browser.formfill.enable");
+ }
+ if (!defaultPrefs.prefIsLocked("browser.download.manager.retention")) {
+ defaultPrefs.setIntPref("browser.download.manager.retention", 0);
+ defaultPrefs.lockPref("browser.download.manager.retention");
+ }
+ gPrefService.setBoolPref("config.lockdown.history.set", true);
+ } else if (isStartup && gPrefService.prefHasUserValue("config.lockdown.history.set")) {
+ if (!defaultPrefs.prefIsLocked("browser.history_expire_days")) {
+ defaultPrefs.clearUserPref("browser.history_expire_days");
+ }
+ if (!defaultPrefs.prefIsLocked("browser.formfill.enable")) {
+ defaultPrefs.clearUserPref("browser.formfill.enable");
+ }
+ if (!defaultPrefs.prefIsLocked("browser.download.manager.retention")) {
+ defaultPrefs.clearUserPref("browser.download.manager.retention");
+ }
+ gPrefService.clearUserPref("config.lockdown.history.set");
+ }
+
+ var disableURLBar = gPrefService.getBoolPref("config.lockdown.urlbar");
+ if (!isStartup || disableURLBar) {
+ lockdownElement("urlbar", disableURLBar);
+ lockdownElement("Browser:OpenLocation", disableURLBar);
+ lockdownElement("Browser:OpenFile", disableURLBar);
+ }
+
+ var disableSearchBar = gPrefService.getBoolPref("config.lockdown.searchbar");
+ if (!isStartup || disableSearchBar) {
+ document.getElementById("search-container")
+ .setAttribute("style", (disableSearchBar) ? "display: none;" : "");
+ }
+
+ var disableToolbarEditing = gPrefService.getBoolPref("config.lockdown.toolbarediting");
+ if (!isStartup || disableToolbarEditing) {
+ var e = document.getElementById("cmd_CustomizeToolbars");
+ if (!e.getAttribute("inCustomization")) {
+ lockdownElement("cmd_CustomizeToolbars", disableToolbarEditing);
+ }
+ }
+
+ // Close sidebar if we disabled the command that's currently in use
+ var sidebarBox = document.getElementById("sidebar-box");
+ var cmd = sidebarBox.getAttribute("sidebarcommand");
+ if (cmd) {
+ var elt = document.getElementById(cmd);
+ if (elt && elt.getAttribute("disabled") == "true") {
+ toggleSidebar(cmd, false);
+ gMustLoadSidebar = false;
+ }
+ }
+}
+
+var lockdownObserver = {
+ observe: function(aSubject, aTopic, aPrefName)
+ {
+ try {
+ applyLockdown(false);
+ } catch (ex) {
+ dump("Failed lockdown: " + ex + "\n");
+ }
+ }
+};
+
+
function delayedStartup()
{
var os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
@@ -942,7 +1086,15 @@ function delayedStartup()
if (!gPrefService)
gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefBranch);
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ try {
+ // do lockdown stuff in an exception handler so that if it fails
+ // catastrophically, the browser should still come up and function
+ applyLockdown(true);
+ gPrefService.addObserver("config.lockdown.", lockdownObserver, false);
+ } catch (ex) {
+ dump("Failed lockdown: " + ex + "\n");
+ }
BrowserOffline.init();
if (gURLBar && document.documentElement.getAttribute("chromehidden").indexOf("toolbar") != -1) {
@@ -961,8 +1113,8 @@ function delayedStartup()
window.addEventListener("keypress", ctrlNumberTabSelection, false);
if (gMustLoadSidebar) {
- var sidebar = document.getElementById("sidebar");
var sidebarBox = document.getElementById("sidebar-box");
+ var sidebar = document.getElementById("sidebar");
sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
}
@@ -1130,6 +1282,8 @@ function BrowserShutdown()
os.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
os.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
+ gPrefService.removeObserver("config.lockdown.", lockdownObserver);
+
try {
gBrowser.removeProgressListener(window.XULBrowserWindow);
} catch (ex) {
@@ -1687,6 +1841,9 @@ function updateGoMenu(aEvent, goMenu)
var history = document.getElementById("hiddenHistoryTree");
+ if (gPrefService.getBoolPref("config.lockdown.history"))
+ return;
+
if (history.hidden) {
history.hidden = false;
var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
@@ -3355,6 +3512,7 @@ function BrowserCustomizeToolbar()
var cmd = document.getElementById("cmd_CustomizeToolbars");
cmd.setAttribute("disabled", "true");
+ cmd.setAttribute("inCustomization", "true");
#ifdef TOOLBAR_CUSTOMIZATION_SHEET
document.getElementById("customizeToolbarSheetBox").hidden = false;
@@ -3382,6 +3540,15 @@ function BrowserCustomizeToolbar()
#endif
}
+function BrowserRestoreCustomizationDisabledState()
+{
+ var cmd = document.getElementById("cmd_CustomizeToolbars");
+ if (!gPrefService.getBoolPref("config.lockdown.toolbarediting")) {
+ cmd.removeAttribute("disabled", "true");
+ }
+ cmd.removeAttribute("inCustomization");
+}
+
function BrowserToolboxCustomizeDone(aToolboxChanged)
{
#ifdef TOOLBAR_CUSTOMIZATION_SHEET
@@ -3422,8 +3589,7 @@ function BrowserToolboxCustomizeDone(aToolboxChanged)
var menubar = document.getElementById("main-menubar");
for (var i = 0; i < menubar.childNodes.length; ++i)
menubar.childNodes[i].setAttribute("disabled", false);
- var cmd = document.getElementById("cmd_CustomizeToolbars");
- cmd.removeAttribute("disabled");
+ BrowserRestoreCustomizationDisabledState();
// XXXmano bug 287105: wallpaper to bug 309953,
// the reload button isn't in sync with the reload command.
@@ -4184,6 +4350,9 @@ function onViewToolbarsPopupShowing(aEvent)
menuItem.setAttribute("toolbarindex", i);
menuItem.setAttribute("type", "checkbox");
menuItem.setAttribute("label", toolbarName);
+ if (toolbar.getAttribute("disabled") == "true") {
+ menuItem.setAttribute("disabled", "true");
+ }
menuItem.setAttribute("accesskey", toolbar.getAttribute("accesskey"));
menuItem.setAttribute("checked", toolbar.getAttribute("collapsed") != "true");
popup.insertBefore(menuItem, firstMenuItem);
@@ -4425,7 +4594,8 @@ nsContextMenu.prototype = {
#endif
this.showItem( "context-setDesktopBackground", haveSetDesktopBackground && this.onLoadedImage );
- if ( haveSetDesktopBackground && this.onLoadedImage )
+ var lockedSetDesktopBackground = gPrefService.getBoolPref("config.lockdown.setwallpaper");
+ if ( haveSetDesktopBackground && this.onLoadedImage && !lockedSetDesktopBackground )
this.setItemAttr( "context-setDesktopBackground", "disabled", this.disableSetDesktopBackground());
// View Image depends on whether an image was clicked on.
diff --git a/browser/components/bookmarks/content/bookmarksProperties.js b/browser/components/bookmarks/content/bookmarksProperties.js
index fddef1d..dc2beec 100644
--- a/browser/components/bookmarks/content/bookmarksProperties.js
+++ b/browser/components/bookmarks/content/bookmarksProperties.js
@@ -138,6 +138,15 @@ function Init()
// set initial focus
nameNode.focus();
nameNode.select();
+
+ // I don't know why doing this is a good idea. If bookmark editing
+ // is disabled we shouldn't let the user into the preferences
+ // dialog.
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranch);
+ if (prefs.getBoolPref("config.lockdown.bookmark")) {
+ document.getElementById("url").setAttribute("disabled", "true");
+ }
}
diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js
index c9b810b..c655107 100644
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -1020,6 +1020,21 @@ pref("config.use_system_prefs", false);
// if the system has enabled accessibility
pref("config.use_system_prefs.accessibility", false);
+// UI lockdown settings
+pref("config.lockdown.printing", false);
+pref("config.lockdown.printsetup", false);
+pref("config.lockdown.savepage", false);
+pref("config.lockdown.history",false);
+pref("config.lockdown.toolbarediting",false);
+pref("config.lockdown.urlbar",false);
+pref("config.lockdown.bookmark",false);
+pref("config.lockdown.disable_themes",false);
+pref("config.lockdown.disable_extensions",false);
+pref("config.lockdown.searchbar",false);
+pref("config.lockdown.hidebookmark",false);
+pref("config.lockdown.setwallpaper",false);
+pref("config.lockdown.showsavedpasswords", false);
+
/*
* What are the entities that you want Mozilla to save using mnemonic
* names rather than numeric codes? E.g. If set, we'll output
diff --git a/toolkit/components/help/content/toolbarCustomization.js b/toolkit/components/help/content/toolbarCustomization.js
index 67a037b..0175d21 100644
--- a/toolkit/components/help/content/toolbarCustomization.js
+++ b/toolkit/components/help/content/toolbarCustomization.js
@@ -42,11 +42,23 @@ function CustomizeToolbar(id)
{
var customizePopup = document.getElementById("cmd_CustomizeToolbars");
customizePopup.setAttribute("disabled", "true");
+ customizePopup.setAttribute("inEdit", "true");
window.openDialog("chrome://help/content/customizeToolbar.xul", "CustomizeToolbar",
"chrome,all,dependent", document.getElementById(id));
}
+function RestoreCustomizationDisabledState()
+{
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ var customizePopup = document.getElementById("cmd_CustomizeToolbars");
+ if (!prefs.getBoolPref("config.lockdown.toolbarediting")) {
+ customizePopup.removeAttribute("disabled");
+ }
+ customizePopup.removeAttribute("inEdit");
+}
+
# ToolboxCustomizeDone() - Resets the toolbar back to its default state. Reenables
# toolbar buttons and the "Customize Toolbar" command.
#
@@ -54,8 +66,7 @@ function CustomizeToolbar(id)
function ToolboxCustomizeDone(aToolboxChanged)
{
# Update global UI elements that may have been added or removed
- var customizePopup = document.getElementById("cmd_CustomizeToolbars");
- customizePopup.removeAttribute("disabled");
+ RestoreCustomizationDisabledState();
# make sure our toolbar buttons have the correct enabled state restored to them...
if (this.UpdateToolbar != undefined)
@@ -77,8 +88,7 @@ function UpdateToolbar(caller)
document.commandDispatcher.updateCommands('help-toolbar');
# re-enable toolbar customization command
- var customizePopup = document.getElementById("cmd_CustomizeToolbars");
- customizePopup.removeAttribute("disabled");
+ RestoreCustomizationDisabledState();
# hook for extra toolbar items
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
diff --git a/toolkit/components/passwordmgr/resources/content/passwordManager.js b/toolkit/components/passwordmgr/resources/content/passwordManager.js
index d128253..9dd9de2 100644
--- a/toolkit/components/passwordmgr/resources/content/passwordManager.js
+++ b/toolkit/components/passwordmgr/resources/content/passwordManager.js
@@ -137,9 +137,14 @@ function LoadSignons() {
// disable "remove all signons" button if there are no signons
var element = document.getElementById("removeAllSignons");
var toggle = document.getElementById("togglePasswords");
+ var viewLocked = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranch)
+ .getBoolPref("config.lockdown.showsavedpasswords");
if (signons.length == 0 || gSelectUserInUse) {
element.setAttribute("disabled","true");
toggle.setAttribute("disabled","true");
+ } else if (viewLocked) {
+ toggle.setAttribute("disabled","true");
} else {
element.removeAttribute("disabled");
toggle.removeAttribute("disabled");
diff --git a/toolkit/components/printing/content/printdialog.js b/toolkit/components/printing/content/printdialog.js
index 4584a8a..b1c5253 100644
--- a/toolkit/components/printing/content/printdialog.js
+++ b/toolkit/components/printing/content/printdialog.js
@@ -51,6 +51,7 @@ var gPrintSettings = null;
var gWebBrowserPrint = null;
var gPrintSetInterface = Components.interfaces.nsIPrintSettings;
var doDebug = false;
+var gPrefService = null;
//---------------------------------------------------
function initDialog()
@@ -88,11 +89,23 @@ function initDialog()
dialog.fpDialog = document.getElementById("fpDialog");
dialog.enabled = false;
+
+ gPrefService = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService).getBranch(null);
+ if (gPrefService.getBoolPref("config.lockdown.savepage")) {
+ dialog.fileCheck.setAttribute("disabled", "true");
+ }
+ if (gPrefService.getBoolPref("config.lockdown.printing")) {
+ dialog.printButton.setAttribute("disabled", "true");
+ }
}
//---------------------------------------------------
function checkInteger(element)
{
+ if (gPrefService.getBoolPref("config.lockdown.printing"))
+ return;
+
var value = element.value;
if (value && value.length > 0) {
value = value.replace(/[^0-9]/g,"");