Bug 693259 - GCLI needs a 'pref' command; r=dcamp

This commit is contained in:
Joe Walker 2012-05-30 08:47:28 +01:00
Родитель 2ebfbe50b8
Коммит c4f5286bd6
9 изменённых файлов: 893 добавлений и 339 удалений

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

@ -1012,8 +1012,9 @@ pref("services.sync.prefs.sync.xpinstall.whitelist.required", true);
// Disable the error console
pref("devtools.errorconsole.enabled", false);
// Enable the developer toolbar
// Developer toolbar and GCLI preferences
pref("devtools.toolbar.enabled", false);
pref("devtools.gcli.allowSet", false);
// Enable the Inspector
pref("devtools.inspector.enabled", true);

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

@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
let EXPORTED_SYMBOLS = [ "GcliCommands" ];
let EXPORTED_SYMBOLS = [ ];
Components.utils.import("resource:///modules/devtools/gcli.jsm");
Components.utils.import("resource:///modules/HUDService.jsm");

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

@ -65,7 +65,7 @@ var mozl10n = {};
})(mozl10n);
define('gcli/index', ['require', 'exports', 'module' , 'gcli/types/basic', 'gcli/types/command', 'gcli/types/javascript', 'gcli/types/node', 'gcli/types/resource', 'gcli/types/setting', 'gcli/types/selection', 'gcli/settings', 'gcli/ui/intro', 'gcli/ui/focus', 'gcli/ui/fields/basic', 'gcli/ui/fields/javascript', 'gcli/ui/fields/selection', 'gcli/commands/help', 'gcli/canon', 'gcli/ui/ffdisplay'], function(require, exports, module) {
define('gcli/index', ['require', 'exports', 'module' , 'gcli/types/basic', 'gcli/types/command', 'gcli/types/javascript', 'gcli/types/node', 'gcli/types/resource', 'gcli/types/setting', 'gcli/types/selection', 'gcli/settings', 'gcli/ui/intro', 'gcli/ui/focus', 'gcli/ui/fields/basic', 'gcli/ui/fields/javascript', 'gcli/ui/fields/selection', 'gcli/commands/help', 'gcli/commands/pref', 'gcli/canon', 'gcli/ui/ffdisplay'], function(require, exports, module) {
// Internal startup process. Not exported
require('gcli/types/basic').startup();
@ -84,6 +84,7 @@ define('gcli/index', ['require', 'exports', 'module' , 'gcli/types/basic', 'gcli
require('gcli/ui/fields/selection').startup();
require('gcli/commands/help').startup();
require('gcli/commands/pref').startup();
// The API for use by command authors
exports.addCommand = require('gcli/canon').addCommand;
@ -1674,7 +1675,7 @@ exports.Speller = Speller;
* http://opensource.org/licenses/BSD-3-Clause
*/
define('gcli/types/selection', ['require', 'exports', 'module' , 'gcli/l10n', 'gcli/types', 'gcli/types/spell', 'gcli/argument'], function(require, exports, module) {
define('gcli/types/selection', ['require', 'exports', 'module' , 'gcli/l10n', 'gcli/types', 'gcli/types/spell'], function(require, exports, module) {
var l10n = require('gcli/l10n');
@ -1683,7 +1684,6 @@ var Type = require('gcli/types').Type;
var Status = require('gcli/types').Status;
var Conversion = require('gcli/types').Conversion;
var Speller = require('gcli/types/spell').Speller;
var Argument = require('gcli/argument').Argument;
/**
@ -1714,6 +1714,9 @@ exports.shutdown = function() {
* the associated name. However the name maybe available directly from the
* value using a property lookup. Setting 'stringifyProperty' allows
* SelectionType to take this shortcut.
* - cacheable : If lookup is a function, then we normally assume that
* the values fetched can change. Setting 'cacheable' enables internal
* caching.
*/
function SelectionType(typeSpec) {
if (typeSpec) {
@ -1743,14 +1746,30 @@ SelectionType.prototype.stringify = function(value) {
return name;
};
/**
* If typeSpec contained cacheable:true then calls to parse() work on cached
* data. clearCache() enables the cache to be cleared.
*/
SelectionType.prototype.clearCache = function() {
delete this._cachedLookup;
};
/**
* There are several ways to get selection data. This unifies them into one
* single function.
* @return An array of objects with name and value properties.
*/
SelectionType.prototype.getLookup = function() {
if (this._cachedLookup) {
return this._cachedLookup;
}
if (this.lookup) {
if (typeof this.lookup === 'function') {
if (this.cacheable) {
this._cachedLookup = this.lookup();
return this._cachedLookup;
}
return this.lookup();
}
return this.lookup;
@ -2257,8 +2276,6 @@ Parameter.prototype.isKnownAs = function(name) {
* parseString on an empty string
*/
Parameter.prototype.getBlank = function() {
var conversion;
if (this.type.getBlank) {
return this.type.getBlank();
}
@ -2357,13 +2374,19 @@ canon.addCommand = function addCommand(commandSpec) {
/**
* Remove an individual command. The opposite of #addCommand().
* Removing a non-existent command is a no-op.
* @param commandOrName Either a command name or the command itself.
* @return true if a command was removed, false otherwise.
*/
canon.removeCommand = function removeCommand(commandOrName) {
var name = typeof commandOrName === 'string' ?
commandOrName :
commandOrName.name;
if (!commands[name]) {
return false;
}
// See start of canon.addCommand if changing this code
delete commands[name];
delete commandSpecs[name];
@ -2372,6 +2395,7 @@ canon.removeCommand = function removeCommand(commandOrName) {
});
canon.onCanonChange();
return true;
};
/**
@ -4186,9 +4210,13 @@ function SettingType(typeSpec) {
if (Object.keys(typeSpec).length > 0) {
throw new Error('SettingType can not be customized');
}
settings.onChange.add(function(ev) {
this.clearCache();
}, this);
}
SettingType.prototype = Object.create(SelectionType.prototype);
SettingType.prototype = new SelectionType({ cacheable: true });
SettingType.prototype.lookup = function() {
return settings.getAll().map(function(setting) {
@ -4269,8 +4297,7 @@ var types = require('gcli/types');
var allSettings = [];
/**
* No setup required because settings are pre-loaded with Mozilla,
* but match API with main settings.js
* Cache existing settings on startup
*/
exports.startup = function() {
imports.prefBranch.getChildList('').forEach(function(name) {
@ -4354,9 +4381,8 @@ Object.defineProperty(Setting.prototype, 'value', {
case imports.prefBranch.PREF_STRING:
var value = imports.prefBranch.getComplexValue(this.name,
Components.interfaces.nsISupportsString).data;
// Try in case it's a localized string (will throw an exception if not)
var isL10n = /^chrome:\/\/.+\/locale\/.+\.properties/.test(value);
if (!this.changed && isL10n) {
// In case of a localized string
if (/^chrome:\/\/.+\/locale\/.+\.properties/.test(value)) {
value = imports.prefBranch.getComplexValue(this.name,
Components.interfaces.nsIPrefLocalizedString).data;
}
@ -4398,6 +4424,13 @@ Object.defineProperty(Setting.prototype, 'value', {
enumerable: true
});
/**
* Reset this setting to it's initial default value
*/
Setting.prototype.setDefault = function() {
imports.prefBranch.clearUserPref(this.name);
Services.prefs.savePrefFile(null);
};
/**
* 'static' function to get an array containing all known Settings
@ -4421,9 +4454,36 @@ exports.addSetting = function(prefSpec) {
allSettings[i] = setting;
}
}
exports.onChange({ added: setting.name });
return setting;
};
/**
* Getter for an existing setting. Generally use of this function should be
* avoided. Systems that define a setting should export it if they wish it to
* be available to the outside, or not otherwise. Use of this function breaks
* that boundary and also hides dependencies. Acceptable uses include testing
* and embedded uses of GCLI that pre-define all settings (e.g. Firefox)
* @param name The name of the setting to fetch
* @return The found Setting object, or undefined if the setting was not found
*/
exports.getSetting = function(name) {
var found = undefined;
allSettings.some(function(setting) {
if (setting.name === name) {
found = setting;
return true;
}
return false;
});
return found;
};
/**
* Event for use to detect when the list of settings changes
*/
exports.onChange = util.createEvent('Settings.onChange');
/**
* Remove a setting. A no-op in this case
*/
@ -8034,6 +8094,151 @@ define("text!gcli/commands/help_list.html", [], "\n" +
define("text!gcli/commands/help.css", [], "");
/*
* Copyright 2009-2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE.txt or:
* http://opensource.org/licenses/BSD-3-Clause
*/
define('gcli/commands/pref', ['require', 'exports', 'module' , 'gcli/canon', 'gcli/l10n', 'gcli/settings', 'text!gcli/commands/pref_set_check.html'], function(require, exports, module) {
var canon = require('gcli/canon');
var l10n = require('gcli/l10n');
var settings = require('gcli/settings');
/**
* Record if the user has clicked on 'Got It!'
*/
var allowSetSettingSpec = {
name: 'allowSet',
type: 'boolean',
description: l10n.lookup('allowSetDesc'),
defaultValue: false
};
exports.allowSet = undefined;
/**
* 'pref' command
*/
var prefCmdSpec = {
name: 'pref',
description: l10n.lookup('prefDesc'),
manual: l10n.lookup('prefManual')
};
/**
* 'pref show' command
*/
var prefShowCmdSpec = {
name: 'pref show',
description: l10n.lookup('prefShowDesc'),
manual: l10n.lookup('prefShowManual'),
params: [
{
name: 'setting',
type: 'setting',
description: l10n.lookup('prefShowSettingDesc'),
manual: l10n.lookup('prefShowSettingManual')
}
],
exec: function Command_prefShow(args, context) {
return args.setting.value;
}
};
/**
* 'pref set' command
*/
var prefSetCmdSpec = {
name: 'pref set',
description: l10n.lookup('prefSetDesc'),
manual: l10n.lookup('prefSetManual'),
params: [
{
name: 'setting',
type: 'setting',
description: l10n.lookup('prefSetSettingDesc'),
manual: l10n.lookup('prefSetSettingManual')
},
{
name: 'value',
type: 'settingValue',
description: l10n.lookup('prefSetValueDesc'),
manual: l10n.lookup('prefSetValueManual')
}
],
exec: function Command_prefSet(args, context) {
if (!exports.allowSet.value &&
args.setting.name !== exports.allowSet.name) {
return context.createView({
html: require('text!gcli/commands/pref_set_check.html'),
options: { allowEval: true, stack: 'pref_set_check.html' },
data: {
l10n: l10n.propertyLookup,
activate: function() {
context.exec('pref set ' + exports.allowSet.name + ' true');
}
},
});
}
args.setting.value = args.value;
return null;
}
};
/**
* 'pref reset' command
*/
var prefResetCmdSpec = {
name: 'pref reset',
description: l10n.lookup('prefResetDesc'),
manual: l10n.lookup('prefResetManual'),
params: [
{
name: 'setting',
type: 'setting',
description: l10n.lookup('prefResetSettingDesc'),
manual: l10n.lookup('prefResetSettingManual')
}
],
exec: function Command_prefReset(args, context) {
args.setting.setDefault();
return null;
}
};
/**
* Registration and de-registration.
*/
exports.startup = function() {
exports.allowSet = settings.addSetting(allowSetSettingSpec);
canon.addCommand(prefCmdSpec);
canon.addCommand(prefShowCmdSpec);
canon.addCommand(prefSetCmdSpec);
canon.addCommand(prefResetCmdSpec);
};
exports.shutdown = function() {
canon.removeCommand(prefCmdSpec);
canon.removeCommand(prefShowCmdSpec);
canon.removeCommand(prefSetCmdSpec);
canon.removeCommand(prefResetCmdSpec);
settings.removeSetting(allowSetSettingSpec);
exports.allowSet = undefined;
};
});
define("text!gcli/commands/pref_set_check.html", [], "<div>\n" +
" <p><strong>${l10n.prefSetCheckHeading}</strong></p>\n" +
" <p>${l10n.prefSetCheckBody}</p>\n" +
" <button onclick=\"${activate}\">${l10n.prefSetCheckGo}</button>\n" +
"</div>\n" +
"");
/*
* Copyright 2009-2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE.txt or:

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

@ -17,6 +17,8 @@ _BROWSER_TEST_FILES = \
browser_gcli_commands.js \
browser_gcli_inspect.js \
browser_gcli_integrate.js \
browser_gcli_pref.js \
browser_gcli_settings.js \
browser_gcli_web.js \
head.js \
$(NULL)

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

@ -0,0 +1,414 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the pref commands work
let imports = {};
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm", imports);
imports.XPCOMUtils.defineLazyGetter(imports, "prefBranch", function() {
let prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
return prefService.getBranch(null)
.QueryInterface(Components.interfaces.nsIPrefBranch2);
});
imports.XPCOMUtils.defineLazyGetter(imports, "supportsString", function() {
return Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
});
const TEST_URI = "data:text/html;charset=utf-8,gcli-pref";
function test() {
DeveloperToolbarTest.test(TEST_URI, function(browser, tab) {
setup();
testPrefSetEnable();
testPrefStatus();
testPrefBoolExec();
testPrefNumberExec();
testPrefStringExec();
testPrefSetDisable();
shutdown();
finish();
});
}
let tiltEnabledOrig = undefined;
let tabSizeOrig = undefined;
let remoteHostOrig = undefined;
function setup() {
Components.utils.import("resource:///modules/devtools/Require.jsm", imports);
imports.settings = imports.require("gcli/settings");
tiltEnabledOrig = imports.prefBranch.getBoolPref("devtools.tilt.enabled");
tabSizeOrig = imports.prefBranch.getIntPref("devtools.editor.tabsize");
remoteHostOrig = imports.prefBranch.getComplexValue(
"devtools.debugger.remote-host",
Components.interfaces.nsISupportsString).data;
info("originally: devtools.tilt.enabled = " + tiltEnabledOrig);
info("originally: devtools.editor.tabsize = " + tabSizeOrig);
info("originally: devtools.debugger.remote-host = " + remoteHostOrig);
}
function shutdown() {
imports.prefBranch.setBoolPref("devtools.tilt.enabled", tiltEnabledOrig);
imports.prefBranch.setIntPref("devtools.editor.tabsize", tabSizeOrig);
imports.supportsString.data = remoteHostOrig;
imports.prefBranch.setComplexValue("devtools.debugger.remote-host",
Components.interfaces.nsISupportsString,
imports.supportsString);
tiltEnabledOrig = undefined;
tabSizeOrig = undefined;
remoteHostOrig = undefined;
imports = undefined;
}
function testPrefStatus() {
DeveloperToolbarTest.checkInputStatus({
typed: "pref s",
markup: "IIIIVI",
status: "ERROR",
directTabText: "et"
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show",
markup: "VVVVVVVVV",
status: "ERROR",
emptyParameters: [ " <setting>" ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show tempTBo",
markup: "VVVVVVVVVVEEEEEEE",
status: "ERROR",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show devtools.toolbar.ena",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
directTabText: "bled",
status: "ERROR",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show hideIntro",
markup: "VVVVVVVVVVVVVVVVVVV",
directTabText: "",
arrowTabText: "devtools.gcli.hideIntro",
status: "ERROR",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show devtools.toolbar.enabled",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
status: "VALID",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show devtools.tilt.enabled 4",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE",
directTabText: "",
status: "ERROR",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref show devtools.tilt.enabled",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
status: "VALID",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref reset devtools.tilt.enabled",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
status: "VALID",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref set devtools.tilt.enabled 4",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVE",
status: "ERROR",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref set devtools.editor.tabsize 4",
markup: "VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV",
status: "VALID",
emptyParameters: [ ]
});
DeveloperToolbarTest.checkInputStatus({
typed: "pref list",
markup: "EEEEVEEEE",
status: "ERROR",
emptyParameters: [ ]
});
}
function testPrefSetEnable() {
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 9",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: 9
},
completed: true,
outputMatch: [ /void your warranty/, /I promise/ ],
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"),
tabSizeOrig,
"devtools.editor.tabsize is unchanged");
DeveloperToolbarTest.exec({
typed: "pref set devtools.gcli.allowSet true",
args: {
setting: imports.settings.getSetting("devtools.gcli.allowSet"),
value: true
},
completed: true,
blankOutput: true,
});
is(imports.prefBranch.getBoolPref("devtools.gcli.allowSet"), true,
"devtools.gcli.allowSet is true");
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 10",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: 10
},
completed: true,
blankOutput: true,
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"),
10,
"devtools.editor.tabsize is 10");
}
function testPrefBoolExec() {
DeveloperToolbarTest.exec({
typed: "pref show devtools.tilt.enabled",
args: {
setting: imports.settings.getSetting("devtools.tilt.enabled")
},
completed: true,
outputMatch: new RegExp("^" + tiltEnabledOrig + "$"),
});
DeveloperToolbarTest.exec({
typed: "pref set devtools.tilt.enabled true",
args: {
setting: imports.settings.getSetting("devtools.tilt.enabled"),
value: true
},
completed: true,
blankOutput: true,
});
is(imports.prefBranch.getBoolPref("devtools.tilt.enabled"), true,
"devtools.tilt.enabled is true");
DeveloperToolbarTest.exec({
typed: "pref show devtools.tilt.enabled",
args: {
setting: imports.settings.getSetting("devtools.tilt.enabled")
},
completed: true,
outputMatch: new RegExp("^true$"),
});
DeveloperToolbarTest.exec({
typed: "pref set devtools.tilt.enabled false",
args: {
setting: imports.settings.getSetting("devtools.tilt.enabled"),
value: false
},
completed: true,
blankOutput: true,
});
DeveloperToolbarTest.exec({
typed: "pref show devtools.tilt.enabled",
args: {
setting: imports.settings.getSetting("devtools.tilt.enabled")
},
completed: true,
outputMatch: new RegExp("^false$"),
});
is(imports.prefBranch.getBoolPref("devtools.tilt.enabled"), false,
"devtools.tilt.enabled is false");
}
function testPrefNumberExec() {
DeveloperToolbarTest.exec({
typed: "pref show devtools.editor.tabsize",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize")
},
completed: true,
outputMatch: new RegExp("^10$"),
});
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 20",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: 20
},
completed: true,
blankOutput: true,
});
DeveloperToolbarTest.exec({
typed: "pref show devtools.editor.tabsize",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize")
},
completed: true,
outputMatch: new RegExp("^20$"),
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"), 20,
"devtools.editor.tabsize is 20");
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 1",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: true
},
completed: true,
blankOutput: true,
});
DeveloperToolbarTest.exec({
typed: "pref show devtools.editor.tabsize",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize")
},
completed: true,
outputMatch: new RegExp("^1$"),
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"), 1,
"devtools.editor.tabsize is 1");
}
function testPrefStringExec() {
DeveloperToolbarTest.exec({
typed: "pref show devtools.debugger.remote-host",
args: {
setting: imports.settings.getSetting("devtools.debugger.remote-host")
},
completed: true,
outputMatch: new RegExp("^" + remoteHostOrig + "$"),
});
DeveloperToolbarTest.exec({
typed: "pref set devtools.debugger.remote-host e.com",
args: {
setting: imports.settings.getSetting("devtools.debugger.remote-host"),
value: "e.com"
},
completed: true,
blankOutput: true,
});
DeveloperToolbarTest.exec({
typed: "pref show devtools.debugger.remote-host",
args: {
setting: imports.settings.getSetting("devtools.debugger.remote-host")
},
completed: true,
outputMatch: new RegExp("^e.com$"),
});
var ecom = imports.prefBranch.getComplexValue(
"devtools.debugger.remote-host",
Components.interfaces.nsISupportsString).data;
is(ecom, "e.com", "devtools.debugger.remote-host is e.com");
DeveloperToolbarTest.exec({
typed: "pref set devtools.debugger.remote-host moz.foo",
args: {
setting: imports.settings.getSetting("devtools.debugger.remote-host"),
value: "moz.foo"
},
completed: true,
blankOutput: true,
});
DeveloperToolbarTest.exec({
typed: "pref show devtools.debugger.remote-host",
args: {
setting: imports.settings.getSetting("devtools.debugger.remote-host")
},
completed: true,
outputMatch: new RegExp("^moz.foo$"),
});
var mozfoo = imports.prefBranch.getComplexValue(
"devtools.debugger.remote-host",
Components.interfaces.nsISupportsString).data;
is(mozfoo, "moz.foo", "devtools.debugger.remote-host is moz.foo");
}
function testPrefSetDisable() {
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 32",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: 32
},
completed: true,
blankOutput: true,
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"), 32,
"devtools.editor.tabsize is 32");
DeveloperToolbarTest.exec({
typed: "pref reset devtools.gcli.allowSet",
args: {
setting: imports.settings.getSetting("devtools.gcli.allowSet")
},
completed: true,
blankOutput: true,
});
is(imports.prefBranch.getBoolPref("devtools.gcli.allowSet"), false,
"devtools.gcli.allowSet is false");
DeveloperToolbarTest.exec({
typed: "pref set devtools.editor.tabsize 33",
args: {
setting: imports.settings.getSetting("devtools.editor.tabsize"),
value: 33
},
completed: true,
outputMatch: [ /void your warranty/, /I promise/ ],
});
is(imports.prefBranch.getIntPref("devtools.editor.tabsize"), 32,
"devtools.editor.tabsize is still 32");
}

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

@ -0,0 +1,149 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the pref commands work
let imports = {};
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm", imports);
imports.XPCOMUtils.defineLazyGetter(imports, "prefBranch", function() {
let prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
return prefService.getBranch(null)
.QueryInterface(Components.interfaces.nsIPrefBranch2);
});
imports.XPCOMUtils.defineLazyGetter(imports, "supportsString", function() {
return Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
});
const TEST_URI = "data:text/html;charset=utf-8,gcli-settings";
function test() {
DeveloperToolbarTest.test(TEST_URI, function(browser, tab) {
setup();
testSettings();
shutdown();
finish();
});
}
let tiltEnabled = undefined;
let tabSize = undefined;
let remoteHost = undefined;
let tiltEnabledOrig = undefined;
let tabSizeOrig = undefined;
let remoteHostOrig = undefined;
function setup() {
Components.utils.import("resource:///modules/devtools/Require.jsm", imports);
imports.settings = imports.require("gcli/settings");
tiltEnabled = imports.settings.getSetting("devtools.tilt.enabled");
tabSize = imports.settings.getSetting("devtools.editor.tabsize");
remoteHost = imports.settings.getSetting("devtools.debugger.remote-host");
tiltEnabledOrig = imports.prefBranch.getBoolPref("devtools.tilt.enabled");
tabSizeOrig = imports.prefBranch.getIntPref("devtools.editor.tabsize");
remoteHostOrig = imports.prefBranch.getComplexValue(
"devtools.debugger.remote-host",
Components.interfaces.nsISupportsString).data;
info("originally: devtools.tilt.enabled = " + tiltEnabledOrig);
info("originally: devtools.editor.tabsize = " + tabSizeOrig);
info("originally: devtools.debugger.remote-host = " + remoteHostOrig);
}
function shutdown() {
imports.prefBranch.setBoolPref("devtools.tilt.enabled", tiltEnabledOrig);
imports.prefBranch.setIntPref("devtools.editor.tabsize", tabSizeOrig);
imports.supportsString.data = remoteHostOrig;
imports.prefBranch.setComplexValue("devtools.debugger.remote-host",
Components.interfaces.nsISupportsString,
imports.supportsString);
tiltEnabled = undefined;
tabSize = undefined;
remoteHost = undefined;
tiltEnabledOrig = undefined;
tabSizeOrig = undefined;
remoteHostOrig = undefined;
imports = undefined;
}
function testSettings() {
is(tiltEnabled.value, tiltEnabledOrig, "tiltEnabled default");
is(tabSize.value, tabSizeOrig, "tabSize default");
is(remoteHost.value, remoteHostOrig, "remoteHost default");
tiltEnabled.setDefault();
tabSize.setDefault();
remoteHost.setDefault();
let tiltEnabledDefault = tiltEnabled.value;
let tabSizeDefault = tabSize.value;
let remoteHostDefault = remoteHost.value;
tiltEnabled.value = false;
tabSize.value = 42;
remoteHost.value = "example.com"
is(tiltEnabled.value, false, "tiltEnabled basic");
is(tabSize.value, 42, "tabSize basic");
is(remoteHost.value, "example.com", "remoteHost basic");
function tiltEnabledCheck(ev) {
is(ev.setting, tiltEnabled, "tiltEnabled event setting");
is(ev.value, true, "tiltEnabled event value");
is(ev.setting.value, true, "tiltEnabled event setting value");
}
tiltEnabled.onChange.add(tiltEnabledCheck);
tiltEnabled.value = true;
is(tiltEnabled.value, true, "tiltEnabled change");
function tabSizeCheck(ev) {
is(ev.setting, tabSize, "tabSize event setting");
is(ev.value, 1, "tabSize event value");
is(ev.setting.value, 1, "tabSize event setting value");
}
tabSize.onChange.add(tabSizeCheck);
tabSize.value = 1;
is(tabSize.value, 1, "tabSize change");
function remoteHostCheck(ev) {
is(ev.setting, remoteHost, "remoteHost event setting");
is(ev.value, "y.com", "remoteHost event value");
is(ev.setting.value, "y.com", "remoteHost event setting value");
}
remoteHost.onChange.add(remoteHostCheck);
remoteHost.value = "y.com";
is(remoteHost.value, "y.com", "remoteHost change");
tiltEnabled.onChange.remove(tiltEnabledCheck);
tabSize.onChange.remove(tabSizeCheck);
remoteHost.onChange.remove(remoteHostCheck);
function remoteHostReCheck(ev) {
is(ev.setting, remoteHost, "remoteHost event reset");
is(ev.value, null, "remoteHost event revalue");
is(ev.setting.value, null, "remoteHost event setting revalue");
}
remoteHost.onChange.add(remoteHostReCheck);
tiltEnabled.setDefault();
tabSize.setDefault();
remoteHost.setDefault();
remoteHost.onChange.remove(remoteHostReCheck);
is(tiltEnabled.value, tiltEnabledDefault, "tiltEnabled reset");
is(tabSize.value, tabSizeDefault, "tabSize reset");
is(remoteHost.value, remoteHostDefault, "remoteHost reset");
}

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

@ -672,6 +672,14 @@ define('gclitest/testCanon', ['require', 'exports', 'module' , 'gclitest/helpers
status: 'ERROR'
});
canon.removeCommand({ name: 'nonexistant' });
test.is(canon.getCommands().length, startCount, 'nonexistant1 command success');
test.is(events, 5, 'nonexistant1 event');
canon.removeCommand('nonexistant');
test.is(canon.getCommands().length, startCount, 'nonexistant2 command success');
test.is(events, 5, 'nonexistant2 event');
canon.onCanonChange.remove(canonChange);
};
@ -2624,9 +2632,69 @@ exports.shutdown = function(options) {
}
};
exports.testPrefShowStatus = function(options) {
if (options.isFirefox) {
test.log('Skipping testPrefShowStatus in Firefox.');
return;
}
helpers.status(options, {
typed: 'pref s',
markup: 'IIIIVI',
status: 'ERROR',
directTabText: 'et'
});
helpers.status(options, {
typed: 'pref show',
markup: 'VVVVVVVVV',
status: 'ERROR',
emptyParameters: [ ' <setting>' ]
});
helpers.status(options, {
typed: 'pref show ',
markup: 'VVVVVVVVVV',
status: 'ERROR',
emptyParameters: [ ]
});
helpers.status(options, {
typed: 'pref show tempTBo',
markup: 'VVVVVVVVVVIIIIIII',
directTabText: 'ol',
status: 'ERROR',
emptyParameters: [ ]
});
helpers.status(options, {
typed: 'pref show tempTBool',
markup: 'VVVVVVVVVVVVVVVVVVV',
directTabText: '',
status: 'VALID',
emptyParameters: [ ]
});
helpers.status(options, {
typed: 'pref show tempTBool 4',
markup: 'VVVVVVVVVVVVVVVVVVVVE',
directTabText: '',
status: 'ERROR',
emptyParameters: [ ]
});
helpers.status(options, {
typed: 'pref show tempNumber 4',
markup: 'VVVVVVVVVVVVVVVVVVVVVE',
directTabText: '',
status: 'ERROR',
emptyParameters: [ ]
});
};
exports.testPrefSetStatus = function(options) {
if (options.isFirefox) {
test.log('Skipping testPref in Firefox.');
test.log('Skipping testPrefSetStatus in Firefox.');
return;
}
@ -2657,13 +2725,6 @@ exports.testPrefSetStatus = function(options) {
emptyParameters: [ ' <value>' ]
});
helpers.status(options, {
typed: 'pref set ',
markup: 'VVVVVVVVV',
status: 'ERROR',
emptyParameters: [ ' <value>' ]
});
helpers.status(options, {
typed: 'pref set tempTBo',
markup: 'VVVVVVVVVIIIIIII',
@ -2691,7 +2752,7 @@ exports.testPrefSetStatus = function(options) {
exports.testPrefExec = function(options) {
if (options.isFirefox) {
test.log('Skipping testPref in Firefox.');
test.log('Skipping testPrefExec in Firefox.');
return;
}
@ -2752,313 +2813,6 @@ exports.testPrefExec = function(options) {
* http://opensource.org/licenses/BSD-3-Clause
*/
define('gcli/commands/pref', ['require', 'exports', 'module' , 'gcli/index', 'gcli/l10n', 'gcli/util', 'gcli/settings', 'gcli/promise', 'text!gcli/commands/pref_list_outer.html', 'text!gcli/commands/pref_list.css', 'text!gcli/commands/pref_set_check.html', 'text!gcli/commands/pref_list_inner.html'], function(require, exports, module) {
var gcli = require('gcli/index');
var l10n = require('gcli/l10n');
var util = require('gcli/util');
var settings = require('gcli/settings');
var Promise = require('gcli/promise').Promise;
/**
* Record if the user has clicked on 'Got It!'
*/
var allowSetSettingSpec = {
name: 'allowSet',
type: 'boolean',
description: l10n.lookup('allowSetDesc'),
defaultValue: false
};
exports.allowSet = undefined;
/**
* 'pref' command
*/
var prefCmdSpec = {
name: 'pref',
description: l10n.lookup('prefDesc'),
manual: l10n.lookup('prefManual')
};
/**
* 'pref list' command
*/
var prefListCmdSpec = {
name: 'pref list',
description: l10n.lookup('prefListDesc'),
manual: l10n.lookup('prefListManual'),
params: [
{
name: 'search',
type: 'string',
defaultValue: null,
description: l10n.lookup('prefListSearchDesc'),
manual: l10n.lookup('prefListSearchManual')
}
],
exec: function Command_prefList(args, context) {
return context.createView({
html: require('text!gcli/commands/pref_list_outer.html'),
data: new PrefList(args, context),
options: {
blankNullUndefined: true,
allowEval: true,
stack: 'pref_list_outer.html'
},
css: require('text!gcli/commands/pref_list.css'),
cssId: 'gcli-pref-list'
});
}
};
/**
* 'pref set' command
*/
var prefSetCmdSpec = {
name: 'pref set',
description: l10n.lookup('prefSetDesc'),
manual: l10n.lookup('prefSetManual'),
params: [
{
name: 'setting',
type: 'setting',
description: l10n.lookup('prefSetSettingDesc'),
manual: l10n.lookup('prefSetSettingManual')
},
{
name: 'value',
type: 'settingValue',
description: l10n.lookup('prefSetValueDesc'),
manual: l10n.lookup('prefSetValueManual')
}
],
exec: function Command_prefSet(args, context) {
if (!exports.allowSet.value &&
args.setting.name !== exports.allowSet.name) {
return context.createView({
html: require('text!gcli/commands/pref_set_check.html'),
options: { allowEval: true, stack: 'pref_set_check.html' },
data: {
l10n: l10n.propertyLookup,
activate: function() {
context.exec('pref set allowSet true');
}
},
});
}
args.setting.value = args.value;
return null;
}
};
/**
* 'pref reset' command
*/
var prefResetCmdSpec = {
name: 'pref reset',
description: l10n.lookup('prefResetDesc'),
manual: l10n.lookup('prefResetManual'),
params: [
{
name: 'setting',
type: 'setting',
description: l10n.lookup('prefResetSettingDesc'),
manual: l10n.lookup('prefResetSettingManual')
}
],
exec: function Command_prefReset(args, context) {
args.setting.setDefault();
return null;
}
};
/**
* Registration and de-registration.
*/
exports.startup = function() {
exports.allowSet = settings.addSetting(allowSetSettingSpec);
gcli.addCommand(prefCmdSpec);
gcli.addCommand(prefListCmdSpec);
gcli.addCommand(prefSetCmdSpec);
gcli.addCommand(prefResetCmdSpec);
};
exports.shutdown = function() {
gcli.removeCommand(prefCmdSpec);
gcli.removeCommand(prefListCmdSpec);
gcli.removeCommand(prefSetCmdSpec);
gcli.removeCommand(prefResetCmdSpec);
settings.removeSetting(allowSetSettingSpec);
exports.allowSet = undefined;
};
/**
* A manager for our version of about:config
*/
function PrefList(args, context) {
this.search = args.search;
this.context = context;
this.url = util.createUrlLookup(module);
this.edit = this.url('pref_list_edit.png');
}
/**
*
*/
PrefList.prototype.onLoad = function(element) {
var table = element.querySelector('.gcli-pref-list-table');
this.updateTable(table);
return '';
};
/**
* Forward localization lookups
*/
PrefList.prototype.l10n = l10n.propertyLookup;
/**
* Called from the template onkeyup for the filter element
*/
PrefList.prototype.updateTable = function(table) {
util.clearElement(table);
var view = this.context.createView({
html: require('text!gcli/commands/pref_list_inner.html'),
options: { blankNullUndefined: true, stack: 'pref_list_inner.html' },
data: this
});
var child = view.toDom(table.ownerDocument);
util.setContents(table, child);
};
/**
* Which preferences match the filter?
*/
Object.defineProperty(PrefList.prototype, 'preferences', {
get: function() {
return settings.getAll(this.search);
},
enumerable: true
});
/**
* Which preferences match the filter?
*/
Object.defineProperty(PrefList.prototype, 'promisePreferences', {
get: function() {
var promise = new Promise();
setTimeout(function() {
promise.resolve(settings.getAll(this.search));
}.bind(this), 10);
return promise;
},
enumerable: true
});
PrefList.prototype.onFilterChange = function(ev) {
if (ev.target.value !== this.search) {
this.search = ev.target.value;
var root = ev.target.parentNode.parentNode;
var table = root.querySelector('.gcli-pref-list-table');
this.updateTable(table);
}
};
PrefList.prototype.onSetClick = function(ev) {
var typed = ev.currentTarget.getAttribute('data-command');
this.context.update(typed);
};
});
define("text!gcli/commands/pref_list_outer.html", [], "<div ignore=\"${onLoad(__element)}\">\n" +
" <div class=\"gcli-pref-list-filter\">\n" +
" ${l10n.prefOutputFilter}:\n" +
" <input onKeyUp=\"${onFilterChange}\" value=\"${search}\"/>\n" +
" </div>\n" +
" <table class=\"gcli-pref-list-table\">\n" +
" <colgroup>\n" +
" <col class=\"gcli-pref-list-name\"/>\n" +
" <col class=\"gcli-pref-list-value\"/>\n" +
" </colgroup>\n" +
" <tr>\n" +
" <th>${l10n.prefOutputName}</th>\n" +
" <th>${l10n.prefOutputValue}</th>\n" +
" </tr>\n" +
" </table>\n" +
" <div class=\"gcli-pref-list-scroller\">\n" +
" <table class=\"gcli-pref-list-table\" save=\"${table}\">\n" +
" </table>\n" +
" </div>\n" +
"</div>\n" +
"");
define("text!gcli/commands/pref_list.css", [], "\n" +
".gcli-pref-list-scroller {\n" +
" max-height: 200px;\n" +
" overflow-y: auto;\n" +
" overflow-x: hidden;\n" +
" display: inline-block;\n" +
"}\n" +
"\n" +
".gcli-pref-list-table {\n" +
" width: 500px;\n" +
" table-layout: fixed;\n" +
"}\n" +
"\n" +
".gcli-pref-list-table tr > th {\n" +
" text-align: left;\n" +
"}\n" +
"\n" +
".gcli-pref-list-table tr > td {\n" +
" text-overflow: elipsis;\n" +
" word-wrap: break-word;\n" +
"}\n" +
"\n" +
".gcli-pref-list-name {\n" +
" width: 70%;\n" +
"}\n" +
"\n" +
".gcli-pref-list-command {\n" +
" display: none;\n" +
"}\n" +
"\n" +
".gcli-pref-list-row:hover .gcli-pref-list-command {\n" +
" display: inline-block;\n" +
"}\n" +
"");
define("text!gcli/commands/pref_set_check.html", [], "<div>\n" +
" <p><strong>${l10n.prefSetCheckHeading}</strong></p>\n" +
" <p>${l10n.prefSetCheckBody}</p>\n" +
" <button onclick=\"${activate}\">${l10n.prefSetCheckGo}</button>\n" +
"</div>\n" +
"");
define("text!gcli/commands/pref_list_inner.html", [], "<table>\n" +
" <colgroup>\n" +
" <col class=\"gcli-pref-list-name\"/>\n" +
" <col class=\"gcli-pref-list-value\"/>\n" +
" </colgroup>\n" +
" <tr class=\"gcli-pref-list-row\" foreach=\"preference in ${promisePreferences}\">\n" +
" <td>${preference.name}</td>\n" +
" <td onclick=\"${onSetClick}\" data-command=\"pref set ${preference.name} \">\n" +
" ${preference.value}\n" +
" <img class=\"gcli-pref-list-command\" _src=\"${edit}\"/>\n" +
" </td>\n" +
" </tr>\n" +
"</table>\n" +
"");
/*
* Copyright 2009-2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE.txt or:
* http://opensource.org/licenses/BSD-3-Clause
*/
define('gclitest/mockSettings', ['require', 'exports', 'module' , 'gcli/settings'], function(require, exports, module) {
@ -4137,11 +3891,6 @@ let testModuleNames = [
'gclitest/testJs',
'gclitest/testKeyboard',
'gclitest/testPref',
'gcli/commands/pref',
'text!gcli/commands/pref_list_outer.html',
'text!gcli/commands/pref_list.css',
'text!gcli/commands/pref_set_check.html',
'text!gcli/commands/pref_list_inner.html',
'gclitest/mockSettings',
'gclitest/testRequire',
'gclitest/requirable',

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

@ -146,7 +146,8 @@ let DeveloperToolbarTest = {
*
* // Thing to check
* args: { message: "hi" }, // Check that the args were understood properly
* outputMatch: /^hi$/, // Regex to test against textContent of output
* outputMatch: /^hi$/, // RegExp to test against textContent of output
* // (can also be array of RegExps)
* blankOutput: true, // Special checks when there is no output
* });
*/
@ -201,10 +202,21 @@ let DeveloperToolbarTest = {
let displayed = DeveloperToolbar.outputPanel._div.textContent;
if (test.outputMatch) {
if (!test.outputMatch.test(displayed)) {
ok(false, "html output for " + typed + " (textContent sent to info)");
info("Actual textContent");
info(displayed);
function doTest(match, against) {
if (!match.test(against)) {
ok(false, "html output for " + typed + " against " + match.source +
" (textContent sent to info)");
info("Actual textContent");
info(against);
}
}
if (Array.isArray(test.outputMatch)) {
test.outputMatch.forEach(function(match) {
doTest(match, displayed);
});
}
else {
doTest(test.outputMatch, displayed);
}
}

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

@ -178,6 +178,28 @@ prefListSearchDesc=Filter the list of settings displayed
# for help on what it does.
prefListSearchManual=Search for the given string in the list of available preferences
# LOCALIZATION NOTE (prefShowDesc): A very short description of the 'pref
# show' command. This string is designed to be shown in a menu alongside the
# command name, which is why it should be as short as possible. See
# prefShowManual for a fuller description of what it does.
prefShowDesc=Display setting value
# LOCALIZATION NOTE (prefShowManual): A fuller description of the 'pref show'
# command. Displayed when the user asks for help on what it does.
prefShowManual=Display the value of a given preference
# LOCALIZATION NOTE (prefShowSettingDesc): A short description of the
# 'setting' parameter to the 'pref show' command. See prefShowSettingManual
# for a fuller description of what it does. This string is designed to be
# shown in a dialog with restricted space, which is why it should be as short
# as possible.
prefShowSettingDesc=Setting to display
# LOCALIZATION NOTE (prefShowSettingManual): A fuller description of the
# 'setting' parameter to the 'pref show' command. Displayed when the user asks
# for help on what it does.
prefShowSettingManual=The name of the setting to display
# LOCALIZATION NOTE (prefSetDesc): A very short description of the 'pref set'
# command. This string is designed to be shown in a menu alongside the command
# name, which is why it should be as short as possible. See prefSetManual for