Bug 669390 - Part 1: Allow setting a preference value from the menulist inline preferences. r=Unfocused
--- a/toolkit/mozapps/extensions/content/extensions.css
+++ b/toolkit/mozapps/extensions/content/extensions.css
@@ -128,19 +128,20 @@ setting[type="color"] {
}
setting[type="file"],
setting[type="directory"] {
display: -moz-grid-line;
-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"] {
display: none;
}
#addonitem-popup[addontype="theme"] > #menuitem_enableItem,
#addonitem-popup[addontype="theme"] > #menuitem_disableItem,
--- a/toolkit/mozapps/extensions/content/setting.xml
+++ b/toolkit/mozapps/extensions/content/setting.xml
@@ -468,34 +468,34 @@
}
return this.input.value = label;
]]>
</setter>
</property>
</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"/>
<xul:label class="preferences-description" xbl:inherits="value=desc" crop="end" flex="1">
<children/>
</xul:label>
</xul:vbox>
<xul:hbox class="setting-input">
- <children include="radiogroup" />
+ <children include="radiogroup,menulist" />
</xul:hbox>
</content>
<implementation>
<constructor>
<![CDATA[
let self = this;
- this.radioGroup.addEventListener("command", function() {
+ this.control.addEventListener("command", function() {
self.valueToPreference();
}, false);
]]>
</constructor>
<method name="valueFromPreference">
<body>
<![CDATA[
@@ -509,37 +509,37 @@
break;
case Ci.nsIPrefBranch.PREF_BOOL:
val = Services.prefs.getBoolPref(this.pref).toString();
break;
default:
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;
}
}
]]>
</body>
</method>
<method name="valueToPreference">
<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))
Services.prefs.setIntPref(this.pref, val);
else
Services.prefs.setCharPref(this.pref, val);
]]>
</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>
--- a/toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js
+++ b/toolkit/mozapps/extensions/test/browser/browser_inlinesettings.js
@@ -75,16 +75,17 @@ function end_test() {
Services.prefs.clearUserPref("extensions.inlinesettings1.integer");
Services.prefs.clearUserPref("extensions.inlinesettings1.string");
Services.prefs.clearUserPref("extensions.inlinesettings1.color");
Services.prefs.clearUserPref("extensions.inlinesettings1.file");
Services.prefs.clearUserPref("extensions.inlinesettings1.directory");
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) {
aAddon.uninstall();
finish();
});
});
}
@@ -273,17 +274,17 @@ add_test(function() {
var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn");
EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow);
wait_for_view_load(gManagerWindow, function() {
is(observer.lastData, "inlinesettings3@tests.mozilla.org", "Observer notification should have fired");
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;
ok(settings[0].hasAttribute("first-row"), "First visible row should have first-row attribute");
Services.prefs.setBoolPref("extensions.inlinesettings3.radioBool", false);
var radios = settings[0].getElementsByTagName("radio");
isnot(radios[0].selected, true, "Correct radio button should be selected");
@@ -310,16 +311,25 @@ add_test(function() {
isnot(radios[0].selected, true, "Correct radio button should be selected");
is(radios[1].selected, true, "Correct radio button should be selected");
isnot(radios[2].selected, true, "Correct radio button should be selected");
EventUtils.synthesizeMouseAtCenter(radios[0], { clickCount: 1 }, gManagerWindow);
is(Services.prefs.getCharPref("extensions.inlinesettings3.radioString"), "india", "Radio pref should have been updated");
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");
gCategoryUtilities.openType("extension", run_next_test);
});
});
// Addon with inline preferences as optionsURL
--- a/toolkit/mozapps/extensions/test/browser/more_options.xul
+++ b/toolkit/mozapps/extensions/test/browser/more_options.xul
@@ -15,9 +15,18 @@
</setting>
<setting pref="extensions.inlinesettings3.radioString" type="radio" title="Radio">
<radiogroup>
<radio label="India" value="india" />
<radio label="Juliet" value="juliet" />
<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>
--- a/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/pinstripe/mozapps/extensions/extensions.css
@@ -1080,16 +1080,17 @@ setting[type="string"] > .setting-input
}
/*** buttons ***/
.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;
min-width: 60px;
border-radius: 3px;
border: 1px solid rgba(60,73,97,0.5);
box-shadow: inset 0 1px rgba(255,255,255,0.25), 0 1px rgba(255,255,255,0.25);
background-image: -moz-linear-gradient(rgba(255,255,255,0.45), rgba(255,255,255,0.2));
@@ -1110,16 +1111,17 @@ setting[type="color"] colorpicker[type="
margin: 1px 5px 2px 5px;
padding: 3px;
height: 25px;
}
.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));
border-color: rgba(60,73,97,0.7);
}
.button-link {
-moz-appearance: none;
--- a/toolkit/themes/winstripe/mozapps/extensions/extensions.css
+++ b/toolkit/themes/winstripe/mozapps/extensions/extensions.css
@@ -1081,16 +1081,17 @@ menulist { /* Fixes some styling inconsi
}
/*** buttons ***/
.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;
padding: 0 5px;
background: -moz-linear-gradient(rgba(251, 252, 253, 0.95), rgba(246, 247, 248, 0) 49%,
rgba(211, 212, 213, 0.45) 51%, rgba(225, 226, 229, 0.3));
background-clip: padding-box;
border-radius: 3px;
@@ -1104,16 +1105,17 @@ setting[type="color"] colorpicker[type="
margin: 1px 5px 2px 5px;
padding: 3px;
height: 25px;
}
.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);
box-shadow: 0 0 3px 1px rgba(39, 53, 68, 0.2) inset;
}
.addon-control > .button-box,
setting:not([type="integer"]) button > .button-box {