michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: "use strict"; michael@0: michael@0: const { Loader } = require("sdk/test/loader"); michael@0: const { setTimeout } = require("sdk/timers"); michael@0: const { emit } = require("sdk/system/events"); michael@0: const { id } = require("sdk/self"); michael@0: const simplePrefs = require("sdk/simple-prefs"); michael@0: const { prefs: sp } = simplePrefs; michael@0: michael@0: const specialChars = "!@#$%^&*()_-=+[]{}~`\'\"<>,./?;:"; michael@0: michael@0: exports.testIterations = function(assert) { michael@0: sp["test"] = true; michael@0: sp["test.test"] = true; michael@0: let prefAry = []; michael@0: for (var name in sp ) { michael@0: prefAry.push(name); michael@0: } michael@0: assert.ok("test" in sp); michael@0: assert.ok(!sp.getPropertyDescriptor); michael@0: assert.ok(Object.prototype.hasOwnProperty.call(sp, "test")); michael@0: assert.equal(["test", "test.test"].toString(), prefAry.sort().toString(), "for (x in y) part 1/2 works"); michael@0: assert.equal(["test", "test.test"].toString(), Object.keys(sp).sort().toString(), "Object.keys works"); michael@0: michael@0: delete sp["test"]; michael@0: delete sp["test.test"]; michael@0: let prefAry = []; michael@0: for (var name in sp ) { michael@0: prefAry.push(name); michael@0: } michael@0: assert.equal([].toString(), prefAry.toString(), "for (x in y) part 2/2 works"); michael@0: } michael@0: michael@0: exports.testSetGetBool = function(assert) { michael@0: assert.equal(sp.test, undefined, "Value should not exist"); michael@0: sp.test = true; michael@0: assert.ok(sp.test, "Value read should be the value previously set"); michael@0: }; michael@0: michael@0: // TEST: setting and getting preferences with special characters work michael@0: exports.testSpecialChars = function(assert, done) { michael@0: let chars = specialChars.split(""); michael@0: let len = chars.length; michael@0: michael@0: let count = 0; michael@0: chars.forEach(function(char) { michael@0: let rand = Math.random() + ""; michael@0: simplePrefs.on(char, function onPrefChanged() { michael@0: simplePrefs.removeListener(char, onPrefChanged); michael@0: assert.equal(sp[char], rand, "setting pref with a name that is a special char, " + char + ", worked!"); michael@0: michael@0: // end test michael@0: if (++count == len) michael@0: done(); michael@0: }) michael@0: sp[char] = rand; michael@0: }); michael@0: }; michael@0: michael@0: exports.testSetGetInt = function(assert) { michael@0: assert.equal(sp["test-int"], undefined, "Value should not exist"); michael@0: sp["test-int"] = 1; michael@0: assert.equal(sp["test-int"], 1, "Value read should be the value previously set"); michael@0: }; michael@0: michael@0: exports.testSetComplex = function(assert) { michael@0: try { michael@0: sp["test-complex"] = {test: true}; michael@0: assert.fail("Complex values are not allowed"); michael@0: } michael@0: catch (e) { michael@0: assert.pass("Complex values are not allowed"); michael@0: } michael@0: }; michael@0: michael@0: exports.testSetGetString = function(assert) { michael@0: assert.equal(sp["test-string"], undefined, "Value should not exist"); michael@0: sp["test-string"] = "test"; michael@0: assert.equal(sp["test-string"], "test", "Value read should be the value previously set"); michael@0: }; michael@0: michael@0: exports.testHasAndRemove = function(assert) { michael@0: sp.test = true; michael@0: assert.ok(("test" in sp), "Value exists"); michael@0: delete sp.test; michael@0: assert.equal(sp.test, undefined, "Value should be undefined"); michael@0: }; michael@0: michael@0: exports.testPrefListener = function(assert, done) { michael@0: let listener = function(prefName) { michael@0: simplePrefs.removeListener('test-listener', listener); michael@0: assert.equal(prefName, "test-listen", "The prefs listener heard the right event"); michael@0: done(); michael@0: }; michael@0: michael@0: simplePrefs.on("test-listen", listener); michael@0: michael@0: sp["test-listen"] = true; michael@0: michael@0: // Wildcard listen michael@0: let toSet = ['wildcard1','wildcard.pref2','wildcard.even.longer.test']; michael@0: let observed = []; michael@0: michael@0: let wildlistener = function(prefName) { michael@0: if (toSet.indexOf(prefName) > -1) observed.push(prefName); michael@0: }; michael@0: michael@0: simplePrefs.on('',wildlistener); michael@0: michael@0: toSet.forEach(function(pref) { michael@0: sp[pref] = true; michael@0: }); michael@0: michael@0: assert.ok((observed.length == 3 && toSet.length == 3), michael@0: "Wildcard lengths inconsistent" + JSON.stringify([observed.length, toSet.length])); michael@0: michael@0: toSet.forEach(function(pref,ii) { michael@0: assert.equal(observed[ii], pref, "Wildcard observed " + pref); michael@0: }); michael@0: michael@0: simplePrefs.removeListener('',wildlistener); michael@0: michael@0: }; michael@0: michael@0: exports.testBtnListener = function(assert, done) { michael@0: let name = "test-btn-listen"; michael@0: simplePrefs.on(name, function listener() { michael@0: simplePrefs.removeListener(name, listener); michael@0: assert.pass("Button press event was heard"); michael@0: done(); michael@0: }); michael@0: emit((id + "-cmdPressed"), { subject: "", data: name }); michael@0: }; michael@0: michael@0: exports.testPrefRemoveListener = function(assert, done) { michael@0: let counter = 0; michael@0: michael@0: let listener = function() { michael@0: assert.pass("The prefs listener was not removed yet"); michael@0: michael@0: if (++counter > 1) michael@0: assert.fail("The prefs listener was not removed"); michael@0: michael@0: simplePrefs.removeListener("test-listen2", listener); michael@0: michael@0: sp["test-listen2"] = false; michael@0: michael@0: setTimeout(function() { michael@0: assert.pass("The prefs listener was removed"); michael@0: done(); michael@0: }, 250); michael@0: }; michael@0: michael@0: simplePrefs.on("test-listen2", listener); michael@0: michael@0: // emit change michael@0: sp["test-listen2"] = true; michael@0: }; michael@0: michael@0: // Bug 710117: Test that simple-pref listeners are removed on unload michael@0: exports.testPrefUnloadListener = function(assert, done) { michael@0: let loader = Loader(module); michael@0: let sp = loader.require("sdk/simple-prefs"); michael@0: let counter = 0; michael@0: michael@0: let listener = function() { michael@0: assert.equal(++counter, 1, "This listener should only be called once"); michael@0: michael@0: loader.unload(); michael@0: michael@0: // this may not execute after unload, but definitely shouldn't fire listener michael@0: sp.prefs["test-listen3"] = false; michael@0: // this should execute, but also definitely shouldn't fire listener michael@0: require("sdk/simple-prefs").prefs["test-listen3"] = false; michael@0: michael@0: done(); michael@0: }; michael@0: michael@0: sp.on("test-listen3", listener); michael@0: michael@0: // emit change michael@0: sp.prefs["test-listen3"] = true; michael@0: }; michael@0: michael@0: michael@0: // Bug 710117: Test that simple-pref listeners are removed on unload michael@0: exports.testPrefUnloadWildcardListener = function(assert, done) { michael@0: let testpref = "test-wildcard-unload-listener"; michael@0: let loader = Loader(module); michael@0: let sp = loader.require("sdk/simple-prefs"); michael@0: let counter = 0; michael@0: michael@0: let listener = function() { michael@0: assert.equal(++counter, 1, "This listener should only be called once"); michael@0: michael@0: loader.unload(); michael@0: michael@0: // this may not execute after unload, but definitely shouldn't fire listener michael@0: sp.prefs[testpref] = false; michael@0: // this should execute, but also definitely shouldn't fire listener michael@0: require("sdk/simple-prefs").prefs[testpref] = false; michael@0: michael@0: done(); michael@0: }; michael@0: michael@0: sp.on("", listener); michael@0: // emit change michael@0: sp.prefs[testpref] = true; michael@0: }; michael@0: michael@0: michael@0: // Bug 732919 - JSON.stringify() fails on simple-prefs.prefs michael@0: exports.testPrefJSONStringification = function(assert) { michael@0: var sp = require("sdk/simple-prefs").prefs; michael@0: assert.equal( michael@0: Object.keys(sp).join(), michael@0: Object.keys(JSON.parse(JSON.stringify(sp))).join(), michael@0: "JSON stringification should work."); michael@0: }; michael@0: michael@0: require('sdk/test').run(exports);