Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
<window title="Preferences Window Tests"
onload="RunTest();">
<script type="application/javascript">
<![CDATA[
SimpleTest.waitForExplicitFinish();
const kPref = SpecialPowers.Services.prefs;
// preference values, set 1
const kPrefValueSet1 = {
int: 23,
bool: true,
string: "rheeet!",
unichar: "äöüßÄÖÜ",
wstring_data: "日本語",
file_data: "/",
wstring: Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
Ci.nsIPrefLocalizedString
),
file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
};
kPrefValueSet1.wstring.data = kPrefValueSet1.wstring_data;
SafeFileInit(kPrefValueSet1.file, kPrefValueSet1.file_data);
// preference values, set 2
const kPrefValueSet2 = {
int: 42,
bool: false,
string: "Mozilla",
unichar: "áôùšŽ",
wstring_data: "헤드라인A",
file_data: "/home",
wstring: Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
Ci.nsIPrefLocalizedString
),
file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
};
kPrefValueSet2.wstring.data = kPrefValueSet2.wstring_data;
SafeFileInit(kPrefValueSet2.file, kPrefValueSet2.file_data);
function SafeFileInit(aFile, aPath) {
// set file path without dying for exceptions
try {
aFile.initWithPath(aPath);
} catch {}
}
function CreateEmptyPrefValueSet() {
var result = {
int: undefined,
bool: undefined,
string: undefined,
unichar: undefined,
wstring_data: undefined,
file_data: undefined,
wstring: undefined,
file: undefined,
};
return result;
}
function WritePrefsToSystem(aPrefValueSet) {
// write preference data via XPCOM
kPref.setIntPref("tests.static_preference_int", aPrefValueSet.int);
kPref.setBoolPref("tests.static_preference_bool", aPrefValueSet.bool);
kPref.setCharPref("tests.static_preference_string", aPrefValueSet.string);
kPref.setStringPref("tests.static_preference_unichar", aPrefValueSet.unichar);
kPref.setComplexValue(
"tests.static_preference_wstring",
Ci.nsIPrefLocalizedString,
aPrefValueSet.wstring
);
kPref.setComplexValue(
"tests.static_preference_file",
Ci.nsIFile,
aPrefValueSet.file
);
}
function ReadPrefsFromSystem() {
// read preference data via XPCOM
var result = CreateEmptyPrefValueSet();
// eslint-disable-next-line mozilla/use-default-preference-values
try {
result.int = kPref.getIntPref("tests.static_preference_int");
} catch {}
// eslint-disable-next-line mozilla/use-default-preference-values
try {
result.bool = kPref.getBoolPref("tests.static_preference_bool");
} catch {}
// eslint-disable-next-line mozilla/use-default-preference-values
try {
result.string = kPref.getCharPref("tests.static_preference_string");
} catch {}
try {
result.unichar = kPref.getStringPref("tests.static_preference_unichar");
} catch {}
try {
result.wstring = kPref.getComplexValue(
"tests.static_preference_wstring",
Ci.nsIPrefLocalizedString
);
result.wstring_data = result.wstring.data;
} catch {}
try {
result.file = kPref.getComplexValue(
"tests.static_preference_file",
Ci.nsIFile
);
result.file_data = result.file.data;
} catch {}
return result;
}
function GetXULElement(aPrefWindow, aID) {
return aPrefWindow.document.getElementById(aID);
}
function GetPreference(aPrefWindow, aID) {
return aPrefWindow.Preferences.get(aID);
}
function WritePrefsToPreferences(aPrefWindow, aPrefValueSet) {
// write preference data into Preference instances
GetPreference(aPrefWindow, "tests.static_preference_int").value =
aPrefValueSet.int;
GetPreference(aPrefWindow, "tests.static_preference_bool").value =
aPrefValueSet.bool;
GetPreference(aPrefWindow, "tests.static_preference_string").value =
aPrefValueSet.string;
GetPreference(aPrefWindow, "tests.static_preference_unichar").value =
aPrefValueSet.unichar;
GetPreference(aPrefWindow, "tests.static_preference_wstring").value =
aPrefValueSet.wstring_data;
GetPreference(aPrefWindow, "tests.static_preference_file").value =
aPrefValueSet.file_data;
}
function ReadPrefsFromPreferences(aPrefWindow) {
// read preference data from Preference instances
var result = {
int: GetPreference(aPrefWindow, "tests.static_preference_int").value,
bool: GetPreference(aPrefWindow, "tests.static_preference_bool").value,
string: GetPreference(aPrefWindow, "tests.static_preference_string").value,
unichar: GetPreference(aPrefWindow, "tests.static_preference_unichar")
.value,
wstring_data: GetPreference(aPrefWindow, "tests.static_preference_wstring")
.value,
file_data: GetPreference(aPrefWindow, "tests.static_preference_file").value,
wstring: Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
Ci.nsIPrefLocalizedString
),
file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
};
result.wstring.data = result.wstring_data;
SafeFileInit(result.file, result.file_data);
return result;
}
function WritePrefsToUI(aPrefWindow, aPrefValueSet) {
// write preference data into UI elements
GetXULElement(aPrefWindow, "static_element_int").value = aPrefValueSet.int;
GetXULElement(aPrefWindow, "static_element_bool").checked =
aPrefValueSet.bool;
GetXULElement(aPrefWindow, "static_element_string").value =
aPrefValueSet.string;
GetXULElement(aPrefWindow, "static_element_unichar").value =
aPrefValueSet.unichar;
GetXULElement(aPrefWindow, "static_element_wstring").value =
aPrefValueSet.wstring_data;
GetXULElement(aPrefWindow, "static_element_file").value =
aPrefValueSet.file_data;
}
function ReadPrefsFromUI(aPrefWindow) {
// read preference data from Preference instances
var result = {
int: GetXULElement(aPrefWindow, "static_element_int").value,
bool: GetXULElement(aPrefWindow, "static_element_bool").checked,
string: GetXULElement(aPrefWindow, "static_element_string").value,
unichar: GetXULElement(aPrefWindow, "static_element_unichar").value,
wstring_data: GetXULElement(aPrefWindow, "static_element_wstring").value,
file_data: GetXULElement(aPrefWindow, "static_element_file").value,
wstring: Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
Ci.nsIPrefLocalizedString
),
file: Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile),
};
result.wstring.data = result.wstring_data;
SafeFileInit(result.file, result.file_data);
return result;
}
function RunInstantPrefTest(aPrefWindow) {
// remark: there's currently no UI element binding for files
// were all Preference instances correctly initialized?
var expected = kPrefValueSet1;
var found = ReadPrefsFromPreferences(aPrefWindow);
ok(found.int === expected.int, "instant pref init int");
ok(found.bool === expected.bool, "instant pref init bool");
ok(found.string === expected.string, "instant pref init string");
ok(found.unichar === expected.unichar, "instant pref init unichar");
ok(found.wstring_data === expected.wstring_data, "instant pref init wstring");
todo(found.file_data === expected.file_data, "instant pref init file");
// were all elements correctly initialized? (loose check)
found = ReadPrefsFromUI(aPrefWindow);
is(found.int, "" + expected.int, "instant element init int");
is(found.bool, expected.bool, "instant element init bool");
is(found.string, expected.string, "instant element init string");
is(found.unichar, expected.unichar, "instant element init unichar");
is(
found.wstring_data, expected.wstring_data,
"instant element init wstring"
);
todo_is(found.file_data == expected.file_data, "instant element init file");
// do some changes in the UI
expected = kPrefValueSet2;
WritePrefsToUI(aPrefWindow, expected);
// UI changes should get passed to the Preference instances,
// but currently they aren't if the changes are made programmatically
// (the handlers preference.change/prefpane.input and prefpane.change
// are called for manual changes, though).
found = ReadPrefsFromPreferences(aPrefWindow);
todo(found.int === expected.int, "instant change pref int");
todo(found.bool === expected.bool, "instant change pref bool");
todo(found.string === expected.string, "instant change pref string");
todo(found.unichar === expected.unichar, "instant change pref unichar");
todo(
found.wstring_data === expected.wstring_data,
"instant change pref wstring"
);
todo(found.file_data === expected.file_data, "instant change pref file");
// and these changes should get passed to the system instantly
// (which obviously can't pass with the above failing)
found = ReadPrefsFromSystem();
todo(found.int === expected.int, "instant change element int");
todo(found.bool === expected.bool, "instant change element bool");
todo(found.string === expected.string, "instant change element string");
todo(found.unichar === expected.unichar, "instant change element unichar");
todo(
found.wstring_data === expected.wstring_data,
"instant change element wstring"
);
todo(found.file_data === expected.file_data, "instant change element file");
// try resetting the prefs to default values (which should be empty here)
GetPreference(aPrefWindow, "tests.static_preference_int").reset();
GetPreference(aPrefWindow, "tests.static_preference_bool").reset();
GetPreference(aPrefWindow, "tests.static_preference_string").reset();
GetPreference(aPrefWindow, "tests.static_preference_unichar").reset();
GetPreference(aPrefWindow, "tests.static_preference_wstring").reset();
GetPreference(aPrefWindow, "tests.static_preference_file").reset();
// check system
expected = CreateEmptyPrefValueSet();
found = ReadPrefsFromSystem();
ok(found.int === expected.int, "instant reset system int");
ok(found.bool === expected.bool, "instant reset system bool");
ok(found.string === expected.string, "instant reset system string");
ok(found.unichar === expected.unichar, "instant reset system unichar");
ok(
found.wstring_data === expected.wstring_data,
"instant reset system wstring"
);
ok(found.file_data === expected.file_data, "instant reset system file");
// check UI
expected = {
// alas, we don't have XUL elements with typeof(value) == int :(
// int: 0,
int: "",
bool: false,
string: "",
unichar: "",
wstring_data: "",
file_data: "",
wstring: {},
file: {},
};
found = ReadPrefsFromUI(aPrefWindow);
ok(found.int === expected.int, "instant reset element int");
ok(found.bool === expected.bool, "instant reset element bool");
ok(found.string === expected.string, "instant reset element string");
ok(found.unichar === expected.unichar, "instant reset element unichar");
ok(
found.wstring_data === expected.wstring_data,
"instant reset element wstring"
);
ok(found.file_data === expected.file_data, "instant reset element file");
// check hasUserValue
ok(
!GetPreference(aPrefWindow, "tests.static_preference_int").hasUserValue,
"instant reset hasUserValue int"
);
ok(
!GetPreference(aPrefWindow, "tests.static_preference_bool").hasUserValue,
"instant reset hasUserValue bool"
);
ok(
!GetPreference(aPrefWindow, "tests.static_preference_string").hasUserValue,
"instant reset hasUserValue string"
);
ok(
!GetPreference(aPrefWindow, "tests.static_preference_unichar").hasUserValue,
"instant reset hasUserValue unichar"
);
ok(
!GetPreference(aPrefWindow, "tests.static_preference_wstring").hasUserValue,
"instant reset hasUserValue wstring"
);
ok(
!GetPreference(aPrefWindow, "tests.static_preference_file").hasUserValue,
"instant reset hasUserValue file"
);
}
function RunCheckCommandRedirect(aPrefWindow) {
ok(
GetPreference(aPrefWindow, "tests.static_preference_bool").value,
"redirected command bool"
);
GetXULElement(aPrefWindow, "checkbox").click();
ok(
!GetPreference(aPrefWindow, "tests.static_preference_bool").value,
"redirected command bool"
);
GetXULElement(aPrefWindow, "checkbox").click();
ok(
GetPreference(aPrefWindow, "tests.static_preference_bool").value,
"redirected command bool"
);
}
function RunCheckDisabled(aPrefWindow) {
ok(
!GetXULElement(aPrefWindow, "disabled_checkbox").disabled,
"Checkbox should be enabled"
);
GetPreference(
aPrefWindow,
"tests.disabled_preference_bool"
).updateControlDisabledState(true);
ok(
GetXULElement(aPrefWindow, "disabled_checkbox").disabled,
"Checkbox should be disabled"
);
GetPreference(
aPrefWindow,
"tests.locked_preference_bool"
).updateControlDisabledState(false);
ok(
GetXULElement(aPrefWindow, "locked_checkbox").disabled,
"Locked checkbox should stay disabled"
);
SimpleTest.finish();
}
function RunResetPrefTest(aPrefWindow) {
// try resetting the prefs to default values
GetPreference(aPrefWindow, "tests.static_preference_int").reset();
GetPreference(aPrefWindow, "tests.static_preference_bool").reset();
GetPreference(aPrefWindow, "tests.static_preference_string").reset();
GetPreference(aPrefWindow, "tests.static_preference_unichar").reset();
GetPreference(aPrefWindow, "tests.static_preference_wstring").reset();
GetPreference(aPrefWindow, "tests.static_preference_file").reset();
}
function RunTestApplyPref() {
// Test in parent window.
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences.xhtml",
"",
"modal",
RunInstantPrefTest,
false
);
// Test deferred reset in child window.
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences2.xhtml",
"",
"modal",
RunResetPrefTest,
false
);
let expected = kPrefValueSet1;
let found = ReadPrefsFromSystem();
is(found.int, expected.int, "instant reset deferred int");
is(found.bool, expected.bool, "instant reset deferred bool");
is(found.string, expected.string, "instant reset deferred string");
is(found.unichar, expected.unichar, "instant reset deferred unichar");
is(
found.wstring_data, expected.wstring_data,
"instant reset deferred wstring"
);
todo_is(found.file_data, expected.file_data, "instant reset deferred file");
// Test cancel in child window.
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences2.xhtml",
"",
"modal",
aPrefWindow => WritePrefsToPreferences(aPrefWindow, kPrefValueSet2),
false
);
expected = kPrefValueSet1;
found = ReadPrefsFromSystem();
ok(found.int === expected.int, "non-instant cancel system int");
ok(found.bool === expected.bool, "non-instant cancel system bool");
ok(found.string === expected.string, "non-instant cancel system string");
ok(found.unichar === expected.unichar, "non-instant cancel system unichar");
ok(
found.wstring_data === expected.wstring_data,
"non-instant cancel system wstring"
);
todo(
found.file_data === expected.file_data,
"non-instant cancel system file"
);
// Test accept in child window.
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences2.xhtml",
"",
"modal",
aPrefWindow => WritePrefsToPreferences(aPrefWindow, kPrefValueSet2),
true
);
expected = kPrefValueSet2;
found = ReadPrefsFromSystem();
ok(found.int === expected.int, "non-instant accept system int");
ok(found.bool === expected.bool, "non-instant accept system bool");
ok(found.string === expected.string, "non-instant accept system string");
ok(found.unichar === expected.unichar, "non-instant accept system unichar");
ok(
found.wstring_data === expected.wstring_data,
"non-instant accept system wstring"
);
todo(
found.file_data === expected.file_data,
"non-instant accept system file"
);
// Test deferred reset in child window.
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences2.xhtml",
"",
"modal",
RunResetPrefTest,
true
);
expected = CreateEmptyPrefValueSet();
found = ReadPrefsFromSystem();
ok(found.int === expected.int, "non-instant reset deferred int");
ok(found.bool === expected.bool, "non-instant reset deferred bool");
ok(found.string === expected.string, "non-instant reset deferred string");
ok(found.unichar === expected.unichar, "non-instant reset deferred unichar");
ok(
found.wstring_data === expected.wstring_data,
"non-instant reset deferred wstring"
);
ok(found.file_data === expected.file_data, "non-instant reset deferred file");
}
function RunTestCommandRedirect() {
WritePrefsToSystem(kPrefValueSet1);
window.browsingContext.topChromeWindow.openDialog(
"window_preferences_commandretarget.xhtml",
"",
"modal",
RunCheckCommandRedirect,
true
);
}
function RunTestDisabled() {
// Because this pref is on the default branch and locked, we need to set it before opening the dialog.
const defaultBranch = kPref.getDefaultBranch("");
defaultBranch.setBoolPref("tests.locked_preference_bool", true);
defaultBranch.lockPref("tests.locked_preference_bool");
window.browsingContext.topChromeWindow.openDialog(
"window_preferences_disabled.xhtml",
"",
"modal",
RunCheckDisabled,
true
);
}
function RunTest() {
RunTestApplyPref();
RunTestCommandRedirect();
RunTestDisabled();
}
]]>
</script>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
</body>
</window>