gecko/toolkit/content/globalOverlay.js

201 lines
5.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
function closeWindow(aClose, aPromptFunction)
{
# Closing the last window doesn't quit the application on OS X.
#ifndef XP_MACOSX
var windowCount = 0;
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var e = wm.getEnumerator(null);
while (e.hasMoreElements()) {
var w = e.getNext();
if (++windowCount == 2)
break;
}
var inPrivateBrowsing = false;
let chromeWin = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow)
.wrappedJSObject;
if (chromeWin != null)
inPrivateBrowsing = chromeWin.gPrivateBrowsingUI.privateWindow;
// If we're down to the last window and someone tries to shut down, check to make sure we can!
if (windowCount == 1 && !canQuitApplication("lastwindow"))
return false;
else if (windowCount != 1 || inPrivateBrowsing)
#endif
if (typeof(aPromptFunction) == "function" && !aPromptFunction())
return false;
if (aClose)
window.close();
return true;
}
function canQuitApplication(aData)
{
var os = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService);
if (!os) return true;
try {
var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
.createInstance(Components.interfaces.nsISupportsPRBool);
os.notifyObservers(cancelQuit, "quit-application-requested", aData || null);
// Something aborted the quit process.
if (cancelQuit.data)
return false;
}
catch (ex) { }
return true;
}
function goQuitApplication()
{
if (!canQuitApplication())
return false;
var appStartup = Components.classes['@mozilla.org/toolkit/app-startup;1'].
getService(Components.interfaces.nsIAppStartup);
appStartup.quit(Components.interfaces.nsIAppStartup.eAttemptQuit);
return true;
}
//
// Command Updater functions
//
function goUpdateCommand(aCommand)
{
try {
var controller = top.document.commandDispatcher
.getControllerForCommand(aCommand);
var enabled = false;
if (controller)
enabled = controller.isCommandEnabled(aCommand);
goSetCommandEnabled(aCommand, enabled);
}
catch (e) {
Components.utils.reportError("An error occurred updating the " +
aCommand + " command: " + e);
}
}
function goDoCommand(aCommand)
{
try {
var controller = top.document.commandDispatcher
.getControllerForCommand(aCommand);
if (controller && controller.isCommandEnabled(aCommand))
controller.doCommand(aCommand);
}
catch (e) {
Components.utils.reportError("An error occurred executing the " +
aCommand + " command: " + e);
}
}
function goSetCommandEnabled(aID, aEnabled)
{
var node = document.getElementById(aID);
if (node) {
if (aEnabled)
node.removeAttribute("disabled");
else
node.setAttribute("disabled", "true");
}
}
function goSetMenuValue(aCommand, aLabelAttribute)
{
var commandNode = top.document.getElementById(aCommand);
if (commandNode) {
var label = commandNode.getAttribute(aLabelAttribute);
if (label)
commandNode.setAttribute("label", label);
}
}
function goSetAccessKey(aCommand, aValueAttribute)
{
var commandNode = top.document.getElementById(aCommand);
if (commandNode) {
var value = commandNode.getAttribute(aValueAttribute);
if (value)
commandNode.setAttribute("accesskey", value);
}
}
// this function is used to inform all the controllers attached to a node that an event has occurred
// (e.g. the tree controllers need to be informed of blur events so that they can change some of the
// menu items back to their default values)
function goOnEvent(aNode, aEvent)
{
var numControllers = aNode.controllers.getControllerCount();
var controller;
for (var controllerIndex = 0; controllerIndex < numControllers; controllerIndex++) {
controller = aNode.controllers.getControllerAt(controllerIndex);
if (controller)
controller.onEvent(aEvent);
}
}
function visitLink(aEvent) {
var node = aEvent.target;
while (node.nodeType != Node.ELEMENT_NODE)
node = node.parentNode;
var url = node.getAttribute("link");
if (!url)
return;
var protocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]
.getService(Components.interfaces.nsIExternalProtocolService);
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var uri = ioService.newURI(url, null, null);
// if the scheme is not an exposed protocol, then opening this link
// should be deferred to the system's external protocol handler
if (protocolSvc.isExposedProtocol(uri.scheme)) {
var win = window.top;
if (win instanceof Components.interfaces.nsIDOMChromeWindow) {
while (win.opener && !win.opener.closed)
win = win.opener;
}
win.open(uri.spec);
}
else
protocolSvc.loadUrl(uri);
}
function setTooltipText(aID, aTooltipText)
{
var element = document.getElementById(aID);
if (element)
element.setAttribute("tooltiptext", aTooltipText);
}
__defineGetter__("NS_ASSERT", function() {
delete this.NS_ASSERT;
var tmpScope = {};
Components.utils.import("resource://gre/modules/debug.js", tmpScope);
return this.NS_ASSERT = tmpScope.NS_ASSERT;
});