summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/test/test-native-options.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/test/test-native-options.js')
-rw-r--r--addon-sdk/source/test/test-native-options.js183
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);