Bug 669390 - Part 1: Allow setting a preference value from the menulist inline preferences. r=Unfocused

This commit is contained in:
Geoff Lankow 2011-08-01 20:05:25 +12:00
parent 0483cd3cc8
commit c4979264d4
6 changed files with 35 additions and 11 deletions

View File

@ -133,9 +133,10 @@ setting[type="directory"] {
-moz-binding: url("chrome://mozapps/content/extensions/setting.xml#setting-path");
}
setting[type="radio"] {
setting[type="radio"],
setting[type="menulist"] {
display: -moz-grid-line;
-moz-binding: url("chrome://mozapps/content/extensions/setting.xml#setting-radio");
-moz-binding: url("chrome://mozapps/content/extensions/setting.xml#setting-multi");
}
#addonitem-popup > menuitem[disabled="true"] {

View File

@ -473,7 +473,7 @@
</implementation>
</binding>
<binding id="setting-radio" extends="chrome://mozapps/content/extensions/setting.xml#setting-base">
<binding id="setting-multi" extends="chrome://mozapps/content/extensions/setting.xml#setting-base">
<content>
<xul:vbox class="setting-label">
<xul:label class="preferences-title" xbl:inherits="value=title" crop="end" flex="1"/>
@ -482,7 +482,7 @@
</xul:label>
</xul:vbox>
<xul:hbox class="setting-input">
<children include="radiogroup" />
<children include="radiogroup,menulist" />
</xul:hbox>
</content>
@ -490,7 +490,7 @@
<constructor>
<![CDATA[
let self = this;
this.radioGroup.addEventListener("command", function() {
this.control.addEventListener("command", function() {
self.valueToPreference();
}, false);
]]>
@ -514,9 +514,9 @@
return;
}
for (let i = 0; i < this.radioGroup.itemCount; i++) {
if (this.radioGroup.getItemAtIndex(i).value == val) {
this.radioGroup.selectedIndex = i;
for (let i = 0; i < this.control.itemCount; i++) {
if (this.control.getItemAtIndex(i).value == val) {
this.control.selectedIndex = i;
break;
}
}
@ -528,7 +528,7 @@
<body>
<![CDATA[
// We might not have a pref already set, so we guess the type from the value attribute
let val = this.radioGroup.selectedItem.value;
let val = this.control.selectedItem.value;
if (val == "true" || val == "false")
Services.prefs.setBoolPref(this.pref, val == "true");
else if (/^-?\d+$/.test(val))
@ -539,7 +539,7 @@
</body>
</method>
<field name="radioGroup">this.getElementsByTagName("radiogroup")[0];</field>
<field name="control">this.getElementsByTagName(this.getAttribute("type") == "radio" ? "radiogroup" : "menulist")[0];</field>
</implementation>
</binding>
</bindings>

View File

@ -80,6 +80,7 @@ function end_test() {
Services.prefs.clearUserPref("extensions.inlinesettings3.radioBool");
Services.prefs.clearUserPref("extensions.inlinesettings3.radioInt");
Services.prefs.clearUserPref("extensions.inlinesettings3.radioString");
Services.prefs.clearUserPref("extensions.inlinesettings3.menulist");
close_manager(gManagerWindow, function() {
AddonManager.getAddonByID("inlinesettings1@tests.mozilla.org", function(aAddon) {
@ -278,7 +279,7 @@ add_test(function() {
var grid = gManagerWindow.document.getElementById("detail-grid");
var settings = grid.querySelectorAll("rows > setting");
is(settings.length, 3, "Grid should have settings children");
is(settings.length, 4, "Grid should have settings children");
// Force bindings to apply
settings[0].clientTop;
@ -315,6 +316,15 @@ add_test(function() {
EventUtils.synthesizeMouseAtCenter(radios[2], { clickCount: 1 }, gManagerWindow);
is(Services.prefs.getCharPref("extensions.inlinesettings3.radioString"), "kilo", "Radio pref should have been updated");
ok(!settings[3].hasAttribute("first-row"), "Not the first row");
Services.prefs.setIntPref("extensions.inlinesettings3.menulist", 8);
var input = settings[3].firstElementChild;
is(input.value, "8", "Menulist should have initial value");
input.focus();
EventUtils.synthesizeKey("n", {}, gManagerWindow);
is(input.value, "9", "Menulist should have updated value");
is(Services.prefs.getIntPref("extensions.inlinesettings3.menulist"), 9, "Menulist pref should have been updated");
button = gManagerWindow.document.getElementById("detail-prefs-btn");
is_element_hidden(button, "Preferences button should not be visible");

View File

@ -20,4 +20,13 @@
<radio label="Kilo" value="kilo" />
</radiogroup>
</setting>
<setting pref="extensions.inlinesettings3.menulist" type="menulist" title="Menulist">
<menulist sizetopopup="always">
<menupopup>
<menuitem label="Lima" value="7" />
<menuitem label="Mike" value="8" />
<menuitem label="November" value="9" />
</menupopup>
</menulist>
</setting>
</vbox>

View File

@ -1085,6 +1085,7 @@ setting[type="string"] > .setting-input > textbox {
.addon-control,
setting:not([type="integer"]) button,
setting[type="control"] menulist,
setting[type="menulist"] menulist,
setting[type="color"] colorpicker[type="button"] {
-moz-appearance: none;
padding: 1px 4px;
@ -1115,6 +1116,7 @@ setting[type="color"] colorpicker[type="button"] {
.addon-control:active:hover,
setting:not([type="integer"]) button:active:hover,
setting[type="control"] menulist:active:hover,
setting[type="menulist"] menulist:active:hover,
setting[type="color"] colorpicker[type="button"]:active:hover {
box-shadow: inset 0 1px 3px rgba(0,0,0,.2), 0 1px rgba(255,255,255,0.25);
background-image: -moz-linear-gradient(rgba(45,54,71,0.3), rgba(45,54,71,0.1));

View File

@ -1086,6 +1086,7 @@ menulist { /* Fixes some styling inconsistencies */
.addon-control,
setting:not([type="integer"]) button,
setting[type="control"] menulist,
setting[type="menulist"] menulist,
setting[type="color"] colorpicker[type="button"] {
-moz-appearance: none;
color: black;
@ -1109,6 +1110,7 @@ setting[type="color"] colorpicker[type="button"] {
.addon-control:active:hover,
setting:not([type="integer"]) button:active:hover,
setting[type="control"] menulist:active:hover,
setting[type="menulist"] menulist:active:hover,
setting[type="color"] colorpicker[type="button"]:active:hover {
background-color: rgba(61, 76, 92, 0.2);
border-color: rgba(39, 53, 68, 0.5);