diff options
Diffstat (limited to 'toolkit/content/tests/chrome/test_preferences.xhtml')
-rw-r--r-- | toolkit/content/tests/chrome/test_preferences.xhtml | 525 |
1 files changed, 525 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_preferences.xhtml b/toolkit/content/tests/chrome/test_preferences.xhtml new file mode 100644 index 0000000000..0b3ddf88be --- /dev/null +++ b/toolkit/content/tests/chrome/test_preferences.xhtml @@ -0,0 +1,525 @@ +<?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" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + onload="RunTest();"> + + <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> + + <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> + + <body xmlns="http://www.w3.org/1999/xhtml"> + <p id="display"></p> + <div id="content" style="display: none"></div> + <pre id="test"></pre> + </body> + +</window> |