diff options
Diffstat (limited to 'addon-sdk/source/test/test-native-options.js')
-rw-r--r-- | addon-sdk/source/test/test-native-options.js | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/addon-sdk/source/test/test-native-options.js b/addon-sdk/source/test/test-native-options.js new file mode 100644 index 000000000..84212757a --- /dev/null +++ b/addon-sdk/source/test/test-native-options.js @@ -0,0 +1,183 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +const { setDefaults, injectOptions: inject, validate } = require('sdk/preferences/native-options'); +const { activeBrowserWindow: { document } } = require("sdk/deprecated/window-utils"); +const { preferencesBranch, id } = require('sdk/self'); +const { get } = require('sdk/preferences/service'); +const { setTimeout } = require('sdk/timers'); +const simple = require('sdk/simple-prefs'); +const fixtures = require('./fixtures'); +const { Cc, Ci } = require('chrome'); + +const prefsrv = Cc['@mozilla.org/preferences-service;1']. + getService(Ci.nsIPrefService); + +function injectOptions(preferences, preferencesBranch, document, parent) { + inject({ + id: id, + preferences: preferences, + preferencesBranch: preferencesBranch, + document: document, + parent: parent + }); +} + +exports.testValidate = function(assert) { + let { preferences } = packageJSON('simple-prefs'); + + let block = () => validate(preferences); + + delete preferences[3].options[0].value; + assert.throws(block, /option requires both a value/, "option missing value error"); + + delete preferences[2].options; + assert.throws(block, /'test3' pref requires options/, "menulist missing options error"); + + preferences[1].type = 'control'; + assert.throws(block, /'test2' control requires a label/, "control missing label error"); + + preferences[1].type = 'nonvalid'; + assert.throws(block, /'test2' pref must be of valid type/, "invalid pref type error"); + + delete preferences[0].title; + assert.throws(block, /'test' pref requires a title/, "pref missing title error"); +} + +exports.testNoPrefs = function(assert, done) { + let { preferences } = packageJSON('no-prefs'); + + let parent = document.createDocumentFragment(); + injectOptions(preferences || [], preferencesBranch, document, parent); + assert.equal(parent.children.length, 0, "No setting elements injected"); + + // must test with events because we can't reset default prefs + function onPrefChange(name) { + assert.fail("No preferences should be defined"); + } + + simple.on('', onPrefChange); + setDefaults(preferences || [], preferencesBranch); + setTimeout(function() { + assert.pass("No preferences were defined"); + simple.off('', onPrefChange); + done(); + }, 100); +} + +exports.testCurlyID = function(assert) { + let { preferences, id } = packageJSON('curly-id'); + let branch = prefsrv.getDefaultBranch('extensions.' + id); + + let parent = document.createDocumentFragment(); + injectOptions(preferences, id, document, parent); + assert.equal(parent.children.length, 1, "One setting elements injected"); + assert.equal(parent.firstElementChild.attributes.pref.value, + "extensions.{34a1eae1-c20a-464f-9b0e-000000000000}.test13", + "Setting pref attribute is set properly"); + + setDefaults(preferences, id); + assert.equal(get('extensions.{34a1eae1-c20a-464f-9b0e-000000000000}.test13'), + 26, "test13 is 26"); + + branch.deleteBranch(''); + assert.equal(get('extensions.{34a1eae1-c20a-464f-9b0e-000000000000}.test13'), + undefined, "test13 is undefined"); +} + +exports.testPreferencesBranch = function(assert) { + let { preferences, 'preferences-branch': prefsBranch } = packageJSON('preferences-branch'); + let branch = prefsrv.getDefaultBranch('extensions.' + prefsBranch); + + let parent = document.createDocumentFragment(); + injectOptions(preferences, prefsBranch, document, parent); + assert.equal(parent.children.length, 1, "One setting elements injected"); + assert.equal(parent.firstElementChild.attributes.pref.value, + "extensions.human-readable.test42", + "Setting pref attribute is set properly"); + + setDefaults(preferences, prefsBranch); + assert.equal(get('extensions.human-readable.test42'), true, "test42 is true"); + + branch.deleteBranch(''); + assert.equal(get('extensions.human-readable.test42'), undefined, "test42 is undefined"); +} + +exports.testSimplePrefs = function(assert) { + let { preferences } = packageJSON('simple-prefs'); + let branch = prefsrv.getDefaultBranch('extensions.' + preferencesBranch); + + function assertPref(setting, name, type, title, description = null) { + assert.equal(setting.getAttribute('data-jetpack-id'), id, + "setting 'data-jetpack-id' attribute correct"); + assert.equal(setting.getAttribute('pref'), 'extensions.' + id + '.' + name, + "setting 'pref' attribute correct"); + assert.equal(setting.getAttribute('pref-name'), name, + "setting 'pref-name' attribute correct"); + assert.equal(setting.getAttribute('type'), type, + "setting 'type' attribute correct"); + assert.equal(setting.getAttribute('title'), title, + "setting 'title' attribute correct"); + if (description) { + assert.equal(setting.getAttribute('desc'), description, + "setting 'desc' attribute correct"); + } + else { + assert.ok(!setting.hasAttribute('desc'), + "setting 'desc' attribute is not present"); + } + } + + function assertOption(option, value, label) { + assert.equal(option.getAttribute('value'), value, "value attribute correct"); + assert.equal(option.getAttribute('label'), label, "label attribute correct"); + } + + let parent = document.createDocumentFragment(); + injectOptions(preferences, preferencesBranch, document, parent); + assert.equal(parent.children.length, 8, "Eight setting elements injected"); + + assertPref(parent.children[0], 'test', 'bool', 't\u00EBst', 'descr\u00EFpti\u00F6n'); + assertPref(parent.children[1], 'test2', 'string', 't\u00EBst'); + assertPref(parent.children[2], 'test3', 'menulist', '"><test'); + assertPref(parent.children[3], 'test4', 'radio', 't\u00EBst'); + + assertPref(parent.children[4], 'test5', 'boolint', 'part part, particle'); + assertPref(parent.children[5], 'test6', 'color', 'pop pop, popscicle'); + assertPref(parent.children[6], 'test7', 'file', 'bike bike'); + assertPref(parent.children[7], 'test8', 'directory', 'test test'); + + let menuItems = parent.children[2].querySelectorAll('menupopup>menuitem'); + let radios = parent.children[3].querySelectorAll('radiogroup>radio'); + + assertOption(menuItems[0], '0', 'label1'); + assertOption(menuItems[1], '1', 'label2'); + assertOption(radios[0], 'red', 'rouge'); + assertOption(radios[1], 'blue', 'bleu'); + + setDefaults(preferences, preferencesBranch); + assert.strictEqual(simple.prefs.test, false, "test is false"); + assert.strictEqual(simple.prefs.test2, "\u00FCnic\u00F8d\u00E9", "test2 is unicode"); + assert.strictEqual(simple.prefs.test3, "1", "test3 is '1'"); + assert.strictEqual(simple.prefs.test4, "red", "test4 is 'red'"); + + // Only delete the test preferences to avoid unsetting any test harness + // preferences. + for (let setting of parent.children) { + let name = setting.getAttribute('pref-name'); + branch.deleteBranch("." + name); + } + + assert.strictEqual(simple.prefs.test, undefined, "test is undefined"); + assert.strictEqual(simple.prefs.test2, undefined, "test2 is undefined"); + assert.strictEqual(simple.prefs.test3, undefined, "test3 is undefined"); + assert.strictEqual(simple.prefs.test4, undefined, "test4 is undefined"); +} + +function packageJSON(dir) { + return require(fixtures.url('preferences/' + dir + '/package.json')); +} + +require('sdk/test').run(exports); |