firefox-ui-lockdown.patch
changeset 26 bfb0e78e1a7d
child 27 23cf7aafb85b
equal deleted inserted replaced
25:fa8130c45304 26:bfb0e78e1a7d
       
     1 diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
       
     2 --- a/browser/base/content/browser.js
       
     3 +++ b/browser/base/content/browser.js
       
     4 @@ -1174,32 +1174,186 @@ function prepareForStartup() {
       
     5    // setup our MozApplicationManifest listener
       
     6    gBrowser.addEventListener("MozApplicationManifest",
       
     7                              OfflineApps, false);
       
     8  
       
     9    // setup simple gestures support
       
    10    gGestureSupport.init(true);
       
    11  }
       
    12  
       
    13 +function lockdownElement(ident, disable, hideCompletely)
       
    14 +{
       
    15 +  var e = document.getElementById(ident);
       
    16 +  if (!e) return;
       
    17 +  if (hideCompletely) {
       
    18 +    e.setAttribute("style", (disable) ? "display: none;" : "");
       
    19 +  } else if (disable) {
       
    20 +    e.setAttribute("disabled", "true");
       
    21 +  } else {
       
    22 +    e.removeAttribute("disabled");
       
    23 +  }
       
    24 +}
       
    25 +
       
    26 +function applyLockdown(isStartup)
       
    27 +{
       
    28 +  // It is important to check that Firefox code does not change the
       
    29 +  // "disabled" state of these UI elements. Fortunately it mostly hides
       
    30 +  // elements rather than disables them.
       
    31 +  var disablePrinting = gPrefService.getBoolPref("config.lockdown.printing");
       
    32 +  var disablePrintSetup = gPrefService.getBoolPref("config.lockdown.printsetup");
       
    33 +  if (!isStartup || disablePrintSetup || disablePrintSetup) {
       
    34 +    lockdownElement("cmd_pageSetup", disablePrinting || disablePrintSetup);
       
    35 +    lockdownElement("menu_printPreview", disablePrinting || disablePrintSetup);
       
    36 +    lockdownElement("cmd_print", disablePrinting);
       
    37 +  }
       
    38 +
       
    39 +  var disableSave = gPrefService.getBoolPref("config.lockdown.savepage");
       
    40 +  if (!isStartup || disableSave) {
       
    41 +    lockdownElement("Browser:SavePage", disableSave);
       
    42 +    lockdownElement("Browser:SaveFrame", disableSave);
       
    43 +    lockdownElement("context-savepage", disableSave);
       
    44 +    lockdownElement("context-saveframe", disableSave);
       
    45 +    lockdownElement("context-savelink", disableSave);
       
    46 +    lockdownElement("context-saveimage", disableSave);
       
    47 +    lockdownElement("View:PageSource", disableSave);
       
    48 +    lockdownElement("context-viewpartialsource-selection", disableSave);
       
    49 +    lockdownElement("context-viewpartialsource-mathml", disableSave);
       
    50 +    lockdownElement("context-viewsource", disableSave);
       
    51 +    lockdownElement("context-viewframesource", disableSave);
       
    52 +    lockdownElement("View:PageInfo", disableSave);
       
    53 +    lockdownElement("context-viewinfo", disableSave);
       
    54 +    lockdownElement("context-viewframeinfo", disableSave);
       
    55 +    lockdownElement("Tasks:InspectPage", disableSave); // from DOMInspector extension
       
    56 +  }
       
    57 +
       
    58 +  var disableBookmarks = gPrefService.getBoolPref("config.lockdown.hidebookmark");
       
    59 +  var disableBookmarkEditing = gPrefService.getBoolPref("config.lockdown.bookmark");
       
    60 +  if (!isStartup || disableBookmarks || disableBookmarkEditing) {
       
    61 +    lockdownElement("bookmarksMenu", disableBookmarks, true);
       
    62 +    lockdownElement("viewBookmarksSidebar", disableBookmarks);
       
    63 +    lockdownElement("PersonalToolbar", disableBookmarks); // XXX check
       
    64 +    lockdownElement("Browser:AddBookmarkAs", disableBookmarks || disableBookmarkEditing);
       
    65 +    lockdownElement("Browser:ShowAllBookmarks", disableBookmarks || disableBookmarkEditing);
       
    66 +    lockdownElement("manBookmark", disableBookmarks || disableBookmarkEditing);
       
    67 +    lockdownElement("context-bookmarkpage", disableBookmarks || disableBookmarkEditing);
       
    68 +    lockdownElement("context-bookmarklink", disableBookmarks || disableBookmarkEditing);
       
    69 +
       
    70 +    // hide the personal bookmarks toolbar if necessary
       
    71 +    if (disableBookmarks) {
       
    72 +      document.getElementById("PersonalToolbar").setAttribute("collapsed", "true");
       
    73 +    }
       
    74 +  }
       
    75 +
       
    76 +  var disableHistory = gPrefService.getBoolPref("config.lockdown.history");
       
    77 +  if (!isStartup || disableHistory) {
       
    78 +    lockdownElement("history-menu", disableHistory, true);
       
    79 +    lockdownElement("viewHistorySidebar", disableHistory);
       
    80 +    lockdownElement("Browser:ShowAllHistory", disableHistory);
       
    81 +    gURLBar.setAttribute("enablehistory", disableHistory ? "false" : "true");
       
    82 +    gURLBar.disableAutoComplete = disableHistory;
       
    83 +  }
       
    84 +
       
    85 +  var defaultPrefs = Cc["@mozilla.org/preferences-service;1"]
       
    86 +      .getService(Ci.nsIPrefService).getDefaultBranch(null);
       
    87 +  if (isStartup && disableHistory) {
       
    88 +    if (!defaultPrefs.prefIsLocked("browser.history_expire_days")) {
       
    89 +      defaultPrefs.setIntPref("browser.history_expire_days", 0);
       
    90 +      defaultPrefs.lockPref("browser.history_expire_days");
       
    91 +    }
       
    92 +    if (!defaultPrefs.prefIsLocked("browser.formfill.enable")) {
       
    93 +      defaultPrefs.setBoolPref("browser.formfill.enable", false);
       
    94 +      defaultPrefs.lockPref("browser.formfill.enable");
       
    95 +    }
       
    96 +    if (!defaultPrefs.prefIsLocked("browser.download.manager.retention")) {
       
    97 +      defaultPrefs.setIntPref("browser.download.manager.retention", 0);
       
    98 +      defaultPrefs.lockPref("browser.download.manager.retention");
       
    99 +    }
       
   100 +    gPrefService.setBoolPref("config.lockdown.history.set", true);
       
   101 +  } else if (isStartup && gPrefService.prefHasUserValue("config.lockdown.history.set")) {
       
   102 +    if (!defaultPrefs.prefIsLocked("browser.history_expire_days")) {
       
   103 +      defaultPrefs.clearUserPref("browser.history_expire_days");
       
   104 +    }
       
   105 +    if (!defaultPrefs.prefIsLocked("browser.formfill.enable")) {
       
   106 +      defaultPrefs.clearUserPref("browser.formfill.enable");
       
   107 +    }
       
   108 +    if (!defaultPrefs.prefIsLocked("browser.download.manager.retention")) {
       
   109 +      defaultPrefs.clearUserPref("browser.download.manager.retention");
       
   110 +    }
       
   111 +    gPrefService.clearUserPref("config.lockdown.history.set");
       
   112 +  }
       
   113 +
       
   114 +  var disableURLBar = gPrefService.getBoolPref("config.lockdown.urlbar");
       
   115 +  if (!isStartup || disableURLBar) {
       
   116 +    lockdownElement("urlbar", disableURLBar);
       
   117 +    lockdownElement("Browser:OpenLocation", disableURLBar);
       
   118 +    lockdownElement("Browser:OpenFile", disableURLBar);
       
   119 +  }
       
   120 +
       
   121 +  var disableSearchBar = gPrefService.getBoolPref("config.lockdown.searchbar");
       
   122 +  if (!isStartup || disableSearchBar) {
       
   123 +    document.getElementById("search-container")
       
   124 +      .setAttribute("style", (disableSearchBar) ? "display: none;" : "");
       
   125 +  }
       
   126 +
       
   127 +  var disableToolbarEditing = gPrefService.getBoolPref("config.lockdown.toolbarediting");
       
   128 +  if (!isStartup || disableToolbarEditing) {
       
   129 +    var e = document.getElementById("cmd_CustomizeToolbars");
       
   130 +    if (!e.getAttribute("inCustomization")) {
       
   131 +      lockdownElement("cmd_CustomizeToolbars", disableToolbarEditing);
       
   132 +    }
       
   133 +  }
       
   134 +
       
   135 +  // Close sidebar if we disabled the command that's currently in use
       
   136 +  var sidebarBox = document.getElementById("sidebar-box");
       
   137 +  var cmd = sidebarBox.getAttribute("sidebarcommand");
       
   138 +  if (cmd) {
       
   139 +    var elt = document.getElementById(cmd);
       
   140 +    if (elt && elt.getAttribute("disabled") == "true") {
       
   141 +      toggleSidebar(cmd, false);
       
   142 +      gMustLoadSidebar = false;
       
   143 +    }
       
   144 +  }
       
   145 +}
       
   146 +
       
   147 +var lockdownObserver = {
       
   148 +  observe: function(aSubject, aTopic, aPrefName)
       
   149 +  {
       
   150 +    try {
       
   151 +      applyLockdown(false);
       
   152 +    } catch (ex) {
       
   153 +      dump("Failed lockdown: " + ex + "\n");
       
   154 +    }
       
   155 +  }
       
   156 +};
       
   157 +
       
   158  function delayedStartup(isLoadingBlank, mustLoadSidebar) {
       
   159    var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
       
   160    os.addObserver(gSessionHistoryObserver, "browser:purge-session-history", false);
       
   161    os.addObserver(gXPInstallObserver, "xpinstall-install-blocked", false);
       
   162  
       
   163 +  try {
       
   164 +    // do lockdown stuff in an exception handler so that if it fails
       
   165 +    // catastrophically, the browser should still come up and function
       
   166 +    applyLockdown(true);
       
   167 +    gPrefService.addObserver("config.lockdown.", lockdownObserver, false);
       
   168 +  } catch (ex) {
       
   169 +    dump("Failed lockdown: " + ex + "\n");
       
   170 +  }
       
   171 +
       
   172    BrowserOffline.init();
       
   173    OfflineApps.init();
       
   174  
       
   175    gBrowser.addEventListener("pageshow", function(evt) { setTimeout(pageShowEventHandlers, 0, evt); }, true);
       
   176  
       
   177    // Ensure login manager is up and running.
       
   178    Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager);
       
   179  
       
   180    if (mustLoadSidebar) {
       
   181 +    let sidebarBox = document.getElementById("sidebar-box");
       
   182      let sidebar = document.getElementById("sidebar");
       
   183 -    let sidebarBox = document.getElementById("sidebar-box");
       
   184      sidebar.setAttribute("src", sidebarBox.getAttribute("src"));
       
   185    }
       
   186  
       
   187    UpdateUrlbarSearchSplitterState();
       
   188    
       
   189    PlacesStarButton.init();
       
   190  
       
   191    // called when we go into full screen, even if it is
       
   192 @@ -1399,16 +1553,18 @@ function BrowserShutdown()
       
   193      Components.utils.reportError(ex);
       
   194    }
       
   195  
       
   196    var os = Components.classes["@mozilla.org/observer-service;1"]
       
   197      .getService(Components.interfaces.nsIObserverService);
       
   198    os.removeObserver(gSessionHistoryObserver, "browser:purge-session-history");
       
   199    os.removeObserver(gXPInstallObserver, "xpinstall-install-blocked");
       
   200  
       
   201 +  gPrefService.removeObserver("config.lockdown.", lockdownObserver);
       
   202 +
       
   203    try {
       
   204      gBrowser.removeProgressListener(window.XULBrowserWindow);
       
   205      gBrowser.removeTabsProgressListener(window.TabsProgressListener);
       
   206    } catch (ex) {
       
   207    }
       
   208  
       
   209    PlacesStarButton.uninit();
       
   210  
       
   211 @@ -3208,16 +3364,22 @@ function FillHistoryMenu(aParent) {
       
   212  
       
   213    // Remove old entries if any
       
   214    var children = aParent.childNodes;
       
   215    for (var i = children.length - 1; i >= 0; --i) {
       
   216      if (children[i].hasAttribute("index"))
       
   217        aParent.removeChild(children[i]);
       
   218    }
       
   219  
       
   220 +  // lockdown. Don't display anything if locked down.
       
   221 +  var disableHistory = gPrefService.getBoolPref("config.lockdown.history");
       
   222 +  if (disableHistory) {
       
   223 +    return false;
       
   224 +  }
       
   225 +
       
   226    var webNav = getWebNavigation();
       
   227    var sessionHistory = webNav.sessionHistory;
       
   228  
       
   229    var count = sessionHistory.count;
       
   230    if (count <= 1) // don't display the popup for a single item
       
   231      return false;
       
   232  
       
   233    const MAX_HISTORY_MENU_ITEMS = 15;
       
   234 @@ -3357,16 +3519,17 @@ function BrowserCustomizeToolbar()
       
   235  {
       
   236    // Disable the toolbar context menu items
       
   237    var menubar = document.getElementById("main-menubar");
       
   238    for (var i = 0; i < menubar.childNodes.length; ++i)
       
   239      menubar.childNodes[i].setAttribute("disabled", true);
       
   240  
       
   241    var cmd = document.getElementById("cmd_CustomizeToolbars");
       
   242    cmd.setAttribute("disabled", "true");
       
   243 +  cmd.setAttribute("inCustomization", "true");
       
   244  
       
   245    var splitter = document.getElementById("urlbar-search-splitter");
       
   246    if (splitter)
       
   247      splitter.parentNode.removeChild(splitter);
       
   248  
       
   249    var customizeURL = "chrome://global/content/customizeToolbar.xul";
       
   250    gCustomizeSheet = getBoolPref("toolbar.customization.usesheet", false);
       
   251  
       
   252 @@ -3394,16 +3557,25 @@ function BrowserCustomizeToolbar()
       
   253    } else {
       
   254      return window.openDialog(customizeURL,
       
   255                               "CustomizeToolbar",
       
   256                               "chrome,titlebar,toolbar,location,resizable,dependent",
       
   257                               gNavToolbox);
       
   258    }
       
   259  }
       
   260  
       
   261 +function BrowserRestoreCustomizationDisabledState()
       
   262 +{
       
   263 +  var cmd = document.getElementById("cmd_CustomizeToolbars");
       
   264 +  if (!gPrefService.getBoolPref("config.lockdown.toolbarediting")) {
       
   265 +    cmd.removeAttribute("disabled", "true");
       
   266 +  }
       
   267 +  cmd.removeAttribute("inCustomization");
       
   268 +}
       
   269 +
       
   270  function BrowserToolboxCustomizeDone(aToolboxChanged) {
       
   271    if (gCustomizeSheet) {
       
   272      document.getElementById("customizeToolbarSheetIFrame").hidden = true;
       
   273      document.getElementById("customizeToolbarSheetPopup").hidePopup();
       
   274    }
       
   275  
       
   276    // Update global UI elements that may have been added or removed
       
   277    if (aToolboxChanged) {
       
   278 @@ -3411,16 +3583,23 @@ function BrowserToolboxCustomizeDone(aTo
       
   279      if (gURLBar)
       
   280        gURLBar.emptyText = gURLBarEmptyText.value;
       
   281  
       
   282      gProxyFavIcon = document.getElementById("page-proxy-favicon");
       
   283      gHomeButton.updateTooltip();
       
   284      gIdentityHandler._cacheElements();
       
   285      window.XULBrowserWindow.init();
       
   286  
       
   287 +    // make sure the search bar is not put back if locked down
       
   288 +    var disableSearchBar = gPrefService.getBoolPref("config.lockdown.searchbar");
       
   289 +    if (disableSearchBar) {
       
   290 +      document.getElementById("search-container")
       
   291 +        .setAttribute("style", (disableSearchBar) ? "display: none;" : "");
       
   292 +    }
       
   293 +
       
   294      var backForwardDropmarker = document.getElementById("back-forward-dropmarker");
       
   295      if (backForwardDropmarker)
       
   296        backForwardDropmarker.disabled =
       
   297          document.getElementById('Browser:Back').hasAttribute('disabled') &&
       
   298          document.getElementById('Browser:Forward').hasAttribute('disabled');
       
   299  
       
   300      // support downgrading to Firefox 2.0
       
   301      var navBar = document.getElementById("nav-bar");
       
   302 @@ -3445,18 +3624,17 @@ function BrowserToolboxCustomizeDone(aTo
       
   303      XULBrowserWindow.asyncUpdateUI();
       
   304      PlacesStarButton.updateState();
       
   305    }
       
   306  
       
   307    // Re-enable parts of the UI we disabled during the dialog
       
   308    var menubar = document.getElementById("main-menubar");
       
   309    for (var i = 0; i < menubar.childNodes.length; ++i)
       
   310      menubar.childNodes[i].setAttribute("disabled", false);
       
   311 -  var cmd = document.getElementById("cmd_CustomizeToolbars");
       
   312 -  cmd.removeAttribute("disabled");
       
   313 +  BrowserRestoreCustomizationDisabledState();
       
   314  
       
   315  #ifdef XP_MACOSX
       
   316    // make sure to re-enable click-and-hold
       
   317    if (!getBoolPref("ui.click_hold_context_menus", false))
       
   318      SetClickAndHoldHandlers();
       
   319  #endif
       
   320  
       
   321    // XXX Shouldn't have to do this, but I do
       
   322 @@ -4544,16 +4722,19 @@ function onViewToolbarsPopupShowing(aEve
       
   323      var toolbarName = toolbar.getAttribute("toolbarname");
       
   324      if (toolbarName) {
       
   325        let menuItem = document.createElement("menuitem");
       
   326        let hidingAttribute = toolbar.getAttribute("type") == "menubar" ?
       
   327                              "autohide" : "collapsed";
       
   328        menuItem.setAttribute("toolbarindex", i);
       
   329        menuItem.setAttribute("type", "checkbox");
       
   330        menuItem.setAttribute("label", toolbarName);
       
   331 +      if (toolbar.getAttribute("disabled") == "true") {
       
   332 +        menuItem.setAttribute("disabled", "true");
       
   333 +      }
       
   334        menuItem.setAttribute("accesskey", toolbar.getAttribute("accesskey"));
       
   335        menuItem.setAttribute("checked", toolbar.getAttribute(hidingAttribute) != "true");
       
   336        popup.insertBefore(menuItem, firstMenuItem);
       
   337  
       
   338        menuItem.addEventListener("command", onViewToolbarCommand, false);
       
   339      }
       
   340      toolbar = toolbar.nextSibling;
       
   341    }
       
   342 @@ -6421,17 +6602,17 @@ BookmarkAllTabsHandler.prototype = {
       
   343  
       
   344    _updateCommandState: function BATH__updateCommandState(aTabClose) {
       
   345      var numTabs = gBrowser.tabContainer.childNodes.length;
       
   346  
       
   347      // The TabClose event is fired before the tab is removed from the DOM
       
   348      if (aTabClose)
       
   349        numTabs--;
       
   350  
       
   351 -    if (numTabs > 1)
       
   352 +    if (numTabs > 1 && !gPrefService.getBoolPref("config.lockdown.bookmark"))
       
   353        this._command.removeAttribute("disabled");
       
   354      else
       
   355        this._command.setAttribute("disabled", "true");
       
   356    },
       
   357  
       
   358    doCommand: function BATH_doCommand() {
       
   359      PlacesCommandHook.bookmarkCurrentPages();
       
   360    },