зеркало из https://github.com/mozilla/pjs.git
Bug 366992 - globalOverlay.js uses bogus controller algorithm. r=gavin.
This commit is contained in:
Родитель
55c83d6b0a
Коммит
72e7b2579d
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче