|
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 }, |