Bug 366992 - globalOverlay.js uses bogus controller algorithm. r=gavin.

This commit is contained in:
mozilla.mano%sent.com 2007-02-14 23:55:20 +00:00
Родитель 55c83d6b0a
Коммит 72e7b2579d
1 изменённых файлов: 74 добавлений и 147 удалений

Просмотреть файл

@ -66,159 +66,86 @@ function goQuitApplication()
return true;
}
/**
* Command Updater
*/
var CommandUpdater = {
/**
* Gets a controller that can handle a particular command.
* @param command
* A command to locate a controller for, preferring controllers that
* show the command as enabled.
* @returns In this order of precedence:
* - the first controller supporting the specified command
* associated with the focused element that advertises the
* command as ENABLED
* - the first controller supporting the specified command
* associated with the global window that advertises the
* command as ENABLED
* - the first controller supporting the specified command
* associated with the focused element
* - the first controller supporting the specified command
* associated with the global window
*/
_getControllerForCommand: function(command) {
try {
var controller =
top.document.commandDispatcher.getControllerForCommand(command);
if (controller && controller.isCommandEnabled(command))
return controller;
}
catch(e) {
}
var controllerCount = window.controllers.getControllerCount();
for (var i = 0; i < controllerCount; ++i) {
var current = window.controllers.getControllerAt(i);
try {
if (current.supportsCommand(command) && current.isCommandEnabled(command))
return current;
}
catch (e) {
}
}
return controller || window.controllers.getControllerForCommand(command);
},
/**
* Updates the state of a XUL <command> element for the specified command
* depending on its state.
* @param command
* The name of the command to update the XUL <command> element for
*/
updateCommand: function(command) {
//
// Command Updater functions
//
function goUpdateCommand(aCommand)
{
try {
var controller = top.document.commandDispatcher
.getControllerForCommand(aCommand);
var enabled = false;
try {
var controller = this._getControllerForCommand(command);
if (controller)
enabled = controller.isCommandEnabled(command);
}
catch(ex) { }
if (controller)
enabled = controller.isCommandEnabled(aCommand);
this.enableCommand(command, enabled);
},
/**
* Enables or disables a XUL <command> element.
* @param command
* The name of the command to enable or disable
* @param enabled
* true if the command should be enabled, false otherwise.
*/
enableCommand: function(command, enabled) {
var element = document.getElementById(command);
if (!element)
return;
if (enabled)
element.removeAttribute("disabled");
goSetCommandEnabled(aCommand, enabled);
}
catch (e) {
dump("An error occurred updating the " + aCommand + " command\n");
}
}
function goDoCommand(aCommand)
{
try {
var controller = top.document.commandDispatcher
.getControllerForCommand(aCommand);
if (controller && controller.isCommandEnabled(aCommand))
controller.doCommand(aCommand);
}
catch (e) {
dump("An error occurred executing the " + aCommand + " command\n" + e + "\n");
}
}
function goSetCommandEnabled(aID, aEnabled)
{
var node = document.getElementById(aID);
if (node) {
if (aEnabled)
node.removeAttribute("disabled");
else
element.setAttribute("disabled", "true");
},
node.setAttribute("disabled", "true");
}
}
/**
* Performs the action associated with a specified command using the most
* relevant controller.
* @param command
* The command to perform.
*/
doCommand: function(command) {
var controller = this._getControllerForCommand(command);
if (!controller)
return;
controller.doCommand(command);
},
/**
* Changes the label attribute for the specified command.
* @param command
* The command to update.
* @param labelAttribute
* The label value to use.
*/
setMenuValue: function(command, labelAttribute) {
var commandNode = top.document.getElementById(command);
if (commandNode)
{
var label = commandNode.getAttribute(labelAttribute);
if ( label )
commandNode.setAttribute('label', label);
}
},
/**
* Changes the accesskey attribute for the specified command.
* @param command
* The command to update.
* @param valueAttribute
* The value attribute to use.
*/
setAccessKey: function(command, valueAttribute) {
var commandNode = top.document.getElementById(command);
if (commandNode)
{
var value = commandNode.getAttribute(valueAttribute);
if ( value )
commandNode.setAttribute('accesskey', value);
}
},
function goSetMenuValue(aCommand, aLabelAttribute)
{
var commandNode = top.document.getElementById(aCommand);
if (commandNode) {
var label = commandNode.getAttribute(aLabelAttribute);
if (label)
commandNode.setAttribute("label", label);
}
}
/**
* 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)
* @param node
* The node receiving the event
* @param event
* The event.
*/
onEvent: function(node, event) {
var numControllers = node.controllers.getControllerCount();
var controller;
function goSetAccessKey(aCommand, aValueAttribute)
{
var commandNode = top.document.getElementById(aCommand);
if (commandNode) {
var value = commandNode.getAttribute(aValueAttribute);
if (value)
commandNode.setAttribute("accesskey", value);
}
}
for ( var controllerIndex = 0; controllerIndex < numControllers; controllerIndex++ )
{
controller = node.controllers.getControllerAt(controllerIndex);
if ( controller )
controller.onEvent(event);
}
}
};
// Shim for compatibility with existing code.
function goDoCommand(command) { CommandUpdater.doCommand(command); }
function goUpdateCommand(command) { CommandUpdater.updateCommand(command); }
function goSetCommandEnabled(command, enabled) { CommandUpdater.enableCommand(command, enabled); }
function goSetMenuValue(command, labelAttribute) { CommandUpdater.setMenuValue(command, labelAttribute); }
function goSetAccessKey(command, valueAttribute) { CommandUpdater.setAccessKey(command, valueAttribute); }
function goOnEvent(node, event) { CommandUpdater.onEvent(node, event); }
// 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(node, 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;