diff options
Diffstat (limited to 'toolkit/mozapps/webextensions/test/browser/browser_inlinesettings.js')
-rw-r--r-- | toolkit/mozapps/webextensions/test/browser/browser_inlinesettings.js | 680 |
1 files changed, 680 insertions, 0 deletions
diff --git a/toolkit/mozapps/webextensions/test/browser/browser_inlinesettings.js b/toolkit/mozapps/webextensions/test/browser/browser_inlinesettings.js new file mode 100644 index 000000000..e2814ddf4 --- /dev/null +++ b/toolkit/mozapps/webextensions/test/browser/browser_inlinesettings.js @@ -0,0 +1,680 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Tests various aspects of the details view +Components.utils.import("resource://gre/modules/Preferences.jsm"); + +var gManagerWindow; +var gCategoryUtilities; +var gProvider; + +const SETTINGS_ROWS = 9; + +var MockFilePicker = SpecialPowers.MockFilePicker; +MockFilePicker.init(window); + +var observer = { + lastDisplayed: null, + callback: null, + checkDisplayed: function(aExpected) { + is(this.lastDisplayed, aExpected, "'addon-options-displayed' notification should have fired"); + this.lastDisplayed = null; + }, + checkNotDisplayed: function() { + is(this.lastDisplayed, null, "'addon-options-displayed' notification should not have fired"); + }, + lastHidden: null, + checkHidden: function(aExpected) { + is(this.lastHidden, aExpected, "'addon-options-hidden' notification should have fired"); + this.lastHidden = null; + }, + checkNotHidden: function() { + is(this.lastHidden, null, "'addon-options-hidden' notification should not have fired"); + }, + observe: function(aSubject, aTopic, aData) { + if (aTopic == AddonManager.OPTIONS_NOTIFICATION_DISPLAYED) { + this.lastDisplayed = aData; + // Test if the binding has applied before the observers are notified. We test the second setting here, + // because the code operates on the first setting and we want to check it applies to all. + var setting = aSubject.querySelector("rows > setting[first-row] ~ setting"); + var input = gManagerWindow.document.getAnonymousElementByAttribute(setting, "class", "preferences-title"); + isnot(input, null, "XBL binding should be applied"); + + // Add some extra height to the scrolling pane to ensure that it needs to scroll when appropriate. + gManagerWindow.document.getElementById("detail-controls").style.marginBottom = "1000px"; + + if (this.callback) { + var tempCallback = this.callback; + this.callback = null; + tempCallback(); + } + } else if (aTopic == AddonManager.OPTIONS_NOTIFICATION_HIDDEN) { + this.lastHidden = aData; + } + } +}; + +function installAddon(aCallback) { + AddonManager.getInstallForURL(TESTROOT + "addons/browser_inlinesettings1.xpi", + function(aInstall) { + aInstall.addListener({ + onInstallEnded: function() { + executeSoon(aCallback); + } + }); + aInstall.install(); + }, "application/x-xpinstall"); +} + +function checkScrolling(aShouldHaveScrolled) { + var detailView = gManagerWindow.document.getElementById("detail-view"); + var boxObject = detailView.boxObject; + ok(detailView.scrollHeight > boxObject.height, "Page should require scrolling"); + if (aShouldHaveScrolled) + isnot(detailView.scrollTop, 0, "Page should have scrolled"); + else + is(detailView.scrollTop, 0, "Page should not have scrolled"); +} + +function test() { + waitForExplicitFinish(); + + gProvider = new MockProvider(); + + gProvider.createAddons([{ + id: "inlinesettings2@tests.mozilla.org", + name: "Inline Settings (Regular)", + version: "1", + optionsURL: CHROMEROOT + "options.xul", + optionsType: AddonManager.OPTIONS_TYPE_INLINE, + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_DISABLE, + }, { + id: "inlinesettings3@tests.mozilla.org", + name: "Inline Settings (More Options)", + description: "Tests for option types introduced after Mozilla 7.0", + version: "1", + optionsURL: CHROMEROOT + "more_options.xul", + optionsType: AddonManager.OPTIONS_TYPE_INLINE + }, { + id: "noninlinesettings@tests.mozilla.org", + name: "Non-Inline Settings", + version: "1", + optionsURL: CHROMEROOT + "addon_prefs.xul" + }]); + + installAddon(function () { + open_manager("addons://list/extension", function(aWindow) { + gManagerWindow = aWindow; + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + + Services.obs.addObserver(observer, + AddonManager.OPTIONS_NOTIFICATION_DISPLAYED, + false); + Services.obs.addObserver(observer, + AddonManager.OPTIONS_NOTIFICATION_HIDDEN, + false); + + run_next_test(); + }); + }); +} + +function end_test() { + Services.obs.removeObserver(observer, + AddonManager.OPTIONS_NOTIFICATION_DISPLAYED); + + Services.prefs.clearUserPref("extensions.inlinesettings1.bool"); + Services.prefs.clearUserPref("extensions.inlinesettings1.boolint"); + Services.prefs.clearUserPref("extensions.inlinesettings1.integer"); + Services.prefs.clearUserPref("extensions.inlinesettings1.string"); + Services.prefs.clearUserPref("extensions.inlinesettings1.color"); + Services.prefs.clearUserPref("extensions.inlinesettings1.file"); + Services.prefs.clearUserPref("extensions.inlinesettings1.directory"); + Services.prefs.clearUserPref("extensions.inlinesettings3.radioBool"); + Services.prefs.clearUserPref("extensions.inlinesettings3.radioInt"); + Services.prefs.clearUserPref("extensions.inlinesettings3.radioString"); + Services.prefs.clearUserPref("extensions.inlinesettings3.menulist"); + + MockFilePicker.cleanup(); + + close_manager(gManagerWindow, function() { + observer.checkHidden("inlinesettings3@tests.mozilla.org"); + Services.obs.removeObserver(observer, + AddonManager.OPTIONS_NOTIFICATION_HIDDEN); + + AddonManager.getAddonByID("inlinesettings1@tests.mozilla.org", function(aAddon) { + aAddon.uninstall(); + finish(); + }); + }); +} + +// Addon with options.xul +add_test(function() { + var addon = get_addon_element(gManagerWindow, "inlinesettings1@tests.mozilla.org"); + is(addon.mAddon.optionsType, AddonManager.OPTIONS_TYPE_INLINE, "Options should be inline type"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + is_element_visible(button, "Preferences button should be visible"); + + run_next_test(); +}); + +// Addon with inline preferences as optionsURL +add_test(function() { + var addon = get_addon_element(gManagerWindow, "inlinesettings2@tests.mozilla.org"); + is(addon.mAddon.optionsType, AddonManager.OPTIONS_TYPE_INLINE, "Options should be inline type"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + is_element_visible(button, "Preferences button should be visible"); + + run_next_test(); +}); + +// Addon with non-inline preferences as optionsURL +add_test(function() { + var addon = get_addon_element(gManagerWindow, "noninlinesettings@tests.mozilla.org"); + is(addon.mAddon.optionsType, AddonManager.OPTIONS_TYPE_DIALOG, "Options should be dialog type"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + is_element_visible(button, "Preferences button should be visible"); + + run_next_test(); +}); + +// Addon with options.xul, also a test for the setting.xml bindings +add_test(function() { + var addon = get_addon_element(gManagerWindow, "inlinesettings1@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings1@tests.mozilla.org"); + is(gManagerWindow.gViewController.currentViewId, + "addons://detail/inlinesettings1%40tests.mozilla.org/preferences", + "Current view should scroll to preferences"); + checkScrolling(true); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, SETTINGS_ROWS, "Grid should have settings children"); + + ok(settings[0].hasAttribute("first-row"), "First visible row should have first-row attribute"); + Services.prefs.setBoolPref("extensions.inlinesettings1.bool", false); + var input = gManagerWindow.document.getAnonymousElementByAttribute(settings[0], "anonid", "input"); + isnot(input.checked, true, "Checkbox should have initial value"); + is(input.label, "Check box label", "Checkbox should be labelled"); + EventUtils.synthesizeMouseAtCenter(input, { clickCount: 1 }, gManagerWindow); + is(input.checked, true, "Checkbox should have updated value"); + is(Services.prefs.getBoolPref("extensions.inlinesettings1.bool"), true, "Bool pref should have been updated"); + EventUtils.synthesizeMouseAtCenter(input, { clickCount: 1 }, gManagerWindow); + isnot(input.checked, true, "Checkbox should have updated value"); + is(Services.prefs.getBoolPref("extensions.inlinesettings1.bool"), false, "Bool pref should have been updated"); + + ok(!settings[1].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setIntPref("extensions.inlinesettings1.boolint", 0); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[1], "anonid", "input"); + isnot(input.checked, true, "Checkbox should have initial value"); + EventUtils.synthesizeMouseAtCenter(input, { clickCount: 1 }, gManagerWindow); + is(input.checked, true, "Checkbox should have updated value"); + is(Services.prefs.getIntPref("extensions.inlinesettings1.boolint"), 1, "BoolInt pref should have been updated"); + EventUtils.synthesizeMouseAtCenter(input, { clickCount: 1 }, gManagerWindow); + isnot(input.checked, true, "Checkbox should have updated value"); + is(Services.prefs.getIntPref("extensions.inlinesettings1.boolint"), 2, "BoolInt pref should have been updated"); + + ok(!settings[2].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setIntPref("extensions.inlinesettings1.integer", 0); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[2], "anonid", "input"); + is(input.value, "0", "Number box should have initial value"); + input.select(); + EventUtils.synthesizeKey("1", {}, gManagerWindow); + EventUtils.synthesizeKey("3", {}, gManagerWindow); + is(input.value, "13", "Number box should have updated value"); + is(Services.prefs.getIntPref("extensions.inlinesettings1.integer"), 13, "Integer pref should have been updated"); + EventUtils.synthesizeKey("VK_DOWN", {}, gManagerWindow); + is(input.value, "12", "Number box should have updated value"); + is(Services.prefs.getIntPref("extensions.inlinesettings1.integer"), 12, "Integer pref should have been updated"); + + ok(!settings[3].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setCharPref("extensions.inlinesettings1.string", "foo"); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[3], "anonid", "input"); + is(input.value, "foo", "Text box should have initial value"); + input.select(); + EventUtils.synthesizeKey("b", {}, gManagerWindow); + EventUtils.synthesizeKey("a", {}, gManagerWindow); + EventUtils.synthesizeKey("r", {}, gManagerWindow); + is(input.value, "bar", "Text box should have updated value"); + input.value += "\u03DE"; // Cheat to add this non-ASCII character without typing it. + EventUtils.synthesizeKey("/", {}, gManagerWindow); + is(input.value, "bar\u03DE/", "Text box should have updated value"); + is(gManagerWindow.document.getBindingParent(gManagerWindow.document.activeElement), input, "Search box should not have focus"); + is(Preferences.get("extensions.inlinesettings1.string", "wrong"), "bar\u03DE/", "String pref should have been updated"); + + ok(!settings[4].hasAttribute("first-row"), "Not the first row"); + input = settings[4].firstElementChild; + is(input.value, "1", "Menulist should have initial value"); + input.focus(); + EventUtils.synthesizeKey("b", {}, gManagerWindow); + is(input.value, "2", "Menulist should have updated value"); + is(gManagerWindow._testValue, "2", "Menulist oncommand handler should've updated the test value"); + delete gManagerWindow._testValue; + + ok(!settings[5].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setCharPref("extensions.inlinesettings1.color", "#FF0000"); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[5], "anonid", "input"); + is(input.color, "#FF0000", "Color picker should have initial value"); + input.focus(); + EventUtils.synthesizeKey("VK_RIGHT", {}, gManagerWindow); + EventUtils.synthesizeKey("VK_RIGHT", {}, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", {}, gManagerWindow); + input.hidePopup(); + is(input.color, "#FF9900", "Color picker should have updated value"); + is(Services.prefs.getCharPref("extensions.inlinesettings1.color"), "#FF9900", "Color pref should have been updated"); + + try { + ok(!settings[6].hasAttribute("first-row"), "Not the first row"); + var button = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "button"); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input"); + is(input.value, "", "Label value should be empty"); + is(input.tooltipText, "", "Label tooltip should be empty"); + + var testFile = Services.dirsvc.get("ProfD", Ci.nsIFile); + testFile.append("\u2622"); + var curProcD = Services.dirsvc.get("CurProcD", Ci.nsIFile); + + MockFilePicker.returnFiles = [testFile]; + MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK; + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file"); + is(input.value, testFile.path, "Label value should match file chosen"); + is(input.tooltipText, testFile.path, "Label tooltip should match file chosen"); + is(Preferences.get("extensions.inlinesettings1.file", "wrong"), testFile.path, "File pref should match file chosen"); + + MockFilePicker.returnFiles = [curProcD]; + MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel; + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + is(MockFilePicker.mode, Ci.nsIFilePicker.modeOpen, "File picker mode should be open file"); + is(input.value, testFile.path, "Label value should not have changed"); + is(input.tooltipText, testFile.path, "Label tooltip should not have changed"); + is(Preferences.get("extensions.inlinesettings1.file", "wrong"), testFile.path, "File pref should not have changed"); + + ok(!settings[7].hasAttribute("first-row"), "Not the first row"); + button = gManagerWindow.document.getAnonymousElementByAttribute(settings[7], "anonid", "button"); + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[7], "anonid", "input"); + is(input.value, "", "Label value should be empty"); + is(input.tooltipText, "", "Label tooltip should be empty"); + + MockFilePicker.returnFiles = [testFile]; + MockFilePicker.returnValue = Ci.nsIFilePicker.returnOK; + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory"); + is(input.value, testFile.path, "Label value should match file chosen"); + is(input.tooltipText, testFile.path, "Label tooltip should match file chosen"); + is(Preferences.get("extensions.inlinesettings1.directory", "wrong"), testFile.path, "Directory pref should match file chosen"); + + MockFilePicker.returnFiles = [curProcD]; + MockFilePicker.returnValue = Ci.nsIFilePicker.returnCancel; + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + is(MockFilePicker.mode, Ci.nsIFilePicker.modeGetFolder, "File picker mode should be directory"); + is(input.value, testFile.path, "Label value should not have changed"); + is(input.tooltipText, testFile.path, "Label tooltip should not have changed"); + is(Preferences.get("extensions.inlinesettings1.directory", "wrong"), testFile.path, "Directory pref should not have changed"); + + var unsizedInput = gManagerWindow.document.getAnonymousElementByAttribute(settings[2], "anonid", "input"); + var sizedInput = gManagerWindow.document.getAnonymousElementByAttribute(settings[8], "anonid", "input"); + is(unsizedInput.clientWidth > sizedInput.clientWidth, true, "Input with size attribute should be smaller than input without"); + } finally { + button = gManagerWindow.document.getElementById("detail-prefs-btn"); + is_element_hidden(button, "Preferences button should not be visible"); + + gCategoryUtilities.openType("extension", run_next_test); + } + }); +}); + +// Tests for the setting.xml bindings introduced after Mozilla 7 +add_test(function() { + observer.checkHidden("inlinesettings1@tests.mozilla.org"); + + var addon = get_addon_element(gManagerWindow, "inlinesettings3@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings3@tests.mozilla.org"); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, 4, "Grid should have settings children"); + + ok(settings[0].hasAttribute("first-row"), "First visible row should have first-row attribute"); + Services.prefs.setBoolPref("extensions.inlinesettings3.radioBool", false); + var radios = settings[0].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + is(radios[1].selected, true, "Correct radio button should be selected"); + EventUtils.synthesizeMouseAtCenter(radios[0], { clickCount: 1 }, gManagerWindow); + is(Services.prefs.getBoolPref("extensions.inlinesettings3.radioBool"), true, "Radio pref should have been updated"); + EventUtils.synthesizeMouseAtCenter(radios[1], { clickCount: 1 }, gManagerWindow); + is(Services.prefs.getBoolPref("extensions.inlinesettings3.radioBool"), false, "Radio pref should have been updated"); + + ok(!settings[1].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setIntPref("extensions.inlinesettings3.radioInt", 5); + radios = settings[1].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + is(radios[1].selected, true, "Correct radio button should be selected"); + isnot(radios[2].selected, true, "Correct radio button should be selected"); + EventUtils.synthesizeMouseAtCenter(radios[0], { clickCount: 1 }, gManagerWindow); + is(Services.prefs.getIntPref("extensions.inlinesettings3.radioInt"), 4, "Radio pref should have been updated"); + EventUtils.synthesizeMouseAtCenter(radios[2], { clickCount: 1 }, gManagerWindow); + is(Services.prefs.getIntPref("extensions.inlinesettings3.radioInt"), 6, "Radio pref should have been updated"); + + ok(!settings[2].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setCharPref("extensions.inlinesettings3.radioString", "juliet"); + radios = settings[2].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + is(radios[1].selected, true, "Correct radio button should be selected"); + isnot(radios[2].selected, true, "Correct radio button should be selected"); + EventUtils.synthesizeMouseAtCenter(radios[0], { clickCount: 1 }, gManagerWindow); + is(Preferences.get("extensions.inlinesettings3.radioString", "wrong"), "india", "Radio pref should have been updated"); + EventUtils.synthesizeMouseAtCenter(radios[2], { clickCount: 1 }, gManagerWindow); + is(Preferences.get("extensions.inlinesettings3.radioString", "wrong"), "kilo \u338F", "Radio pref should have been updated"); + + ok(!settings[3].hasAttribute("first-row"), "Not the first row"); + Services.prefs.setIntPref("extensions.inlinesettings3.menulist", 8); + var input = settings[3].firstElementChild; + is(input.value, "8", "Menulist should have initial value"); + input.focus(); + EventUtils.synthesizeKey("n", {}, gManagerWindow); + is(input.value, "9", "Menulist should have updated value"); + is(Services.prefs.getIntPref("extensions.inlinesettings3.menulist"), 9, "Menulist pref should have been updated"); + + button = gManagerWindow.document.getElementById("detail-prefs-btn"); + is_element_hidden(button, "Preferences button should not be visible"); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); + +// Addon with inline preferences as optionsURL +add_test(function() { + observer.checkHidden("inlinesettings3@tests.mozilla.org"); + + var addon = get_addon_element(gManagerWindow, "inlinesettings2@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings2@tests.mozilla.org"); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, 5, "Grid should have settings children"); + + var node = settings[0]; + node = settings[0]; + is_element_hidden(node, "Unsupported settings should not be visible"); + ok(!node.hasAttribute("first-row"), "Hidden row is not the first row"); + + node = settings[1]; + is(node.nodeName, "setting", "Should be a setting node"); + ok(node.hasAttribute("first-row"), "First visible row should have first-row attribute"); + var description = gManagerWindow.document.getAnonymousElementByAttribute(node, "class", "preferences-description"); + is(description.textContent, "Description Attribute", "Description node should contain description"); + + node = settings[2]; + is(node.nodeName, "setting", "Should be a setting node"); + ok(!node.hasAttribute("first-row"), "Not the first row"); + description = gManagerWindow.document.getAnonymousElementByAttribute(node, "class", "preferences-description"); + is(description.textContent, "Description Text Node", "Description node should contain description"); + + node = settings[3]; + is(node.nodeName, "setting", "Should be a setting node"); + ok(!node.hasAttribute("first-row"), "Not the first row"); + description = gManagerWindow.document.getAnonymousElementByAttribute(node, "class", "preferences-description"); + is(description.textContent, "This is a test, all this text should be visible", "Description node should contain description"); + var button = node.firstElementChild; + isnot(button, null, "There should be a button"); + + node = settings[4]; + is_element_hidden(node, "Unsupported settings should not be visible"); + ok(!node.hasAttribute("first-row"), "Hidden row is not the first row"); + + button = gManagerWindow.document.getElementById("detail-prefs-btn"); + is_element_hidden(button, "Preferences button should not be visible"); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); + +// Addon with non-inline preferences as optionsURL +add_test(function() { + observer.checkHidden("inlinesettings2@tests.mozilla.org"); + + var addon = get_addon_element(gManagerWindow, "noninlinesettings@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "details-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkNotDisplayed(); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, 0, "Grid should not have settings children"); + + var button = gManagerWindow.document.getElementById("detail-prefs-btn"); + is_element_visible(button, "Preferences button should be visible"); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); + +// Addon with options.xul, disabling and enabling should hide and show settings UI +add_test(function() { + observer.checkNotHidden(); + + var addon = get_addon_element(gManagerWindow, "inlinesettings1@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "details-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings1@tests.mozilla.org"); + is(gManagerWindow.gViewController.currentViewId, + "addons://detail/inlinesettings1%40tests.mozilla.org", + "Current view should not scroll to preferences"); + checkScrolling(false); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, SETTINGS_ROWS, "Grid should have settings children"); + + // disable + var button = gManagerWindow.document.getElementById("detail-disable-btn"); + button.scrollIntoView(); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + observer.checkHidden("inlinesettings1@tests.mozilla.org"); + + settings = grid.querySelectorAll("rows > setting"); + is(settings.length, 0, "Grid should not have settings children"); + + gCategoryUtilities.openType("extension", function() { + var addon = get_addon_element(gManagerWindow, "inlinesettings1@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + is_element_hidden(button, "Preferences button should not be visible"); + + button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "details-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + is(settings.length, 0, "Grid should not have settings children"); + + // enable + var button = gManagerWindow.document.getElementById("detail-enable-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + observer.callback = function() { + observer.checkDisplayed("inlinesettings1@tests.mozilla.org"); + + settings = grid.querySelectorAll("rows > setting"); + is(settings.length, SETTINGS_ROWS, "Grid should have settings children"); + + gCategoryUtilities.openType("extension", run_next_test); + }; + }); + }); + }); +}); + + +// Addon with options.xul that requires a restart to disable, +// disabling and enabling should not hide and show settings UI. +add_test(function() { + observer.checkHidden("inlinesettings1@tests.mozilla.org"); + + var addon = get_addon_element(gManagerWindow, "inlinesettings2@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "details-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings2@tests.mozilla.org"); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + ok(settings.length > 0, "Grid should have settings children"); + + // disable + var button = gManagerWindow.document.getElementById("detail-disable-btn"); + button.scrollIntoView(); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + observer.checkNotHidden(); + + settings = grid.querySelectorAll("rows > setting"); + ok(settings.length > 0, "Grid should still have settings children"); + + // cancel pending disable + button = gManagerWindow.document.getElementById("detail-enable-btn"); + button.scrollIntoView(); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + observer.checkNotDisplayed(); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); + +// Tests bindings with existing prefs. +add_test(function() { + observer.checkHidden("inlinesettings2@tests.mozilla.org"); + + // Ensure these prefs are set. They should be set above, but somebody might + // change the tests above. + var profD = Services.dirsvc.get("ProfD", Ci.nsIFile); + Services.prefs.setBoolPref("extensions.inlinesettings1.bool", false); + Services.prefs.setIntPref("extensions.inlinesettings1.boolint", 1); + Services.prefs.setIntPref("extensions.inlinesettings1.integer", 12); + Preferences.set("extensions.inlinesettings1.string", "bar\u03DE/"); + Services.prefs.setCharPref("extensions.inlinesettings1.color", "#FF9900"); + Services.prefs.setCharPref("extensions.inlinesettings1.file", profD.path); + Services.prefs.setCharPref("extensions.inlinesettings1.directory", profD.path); + + var addon = get_addon_element(gManagerWindow, "inlinesettings1@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings1@tests.mozilla.org"); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + + var input = gManagerWindow.document.getAnonymousElementByAttribute(settings[0], "anonid", "input"); + is(input.checked, false, "Checkbox should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[1], "anonid", "input"); + is(input.checked, true, "Checkbox should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[2], "anonid", "input"); + is(input.value, "12", "Number box should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[3], "anonid", "input"); + is(input.value, "bar\u03DE/", "Text box should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[5], "anonid", "input"); + is(input.color, "#FF9900", "Color picker should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[6], "anonid", "input"); + is(input.value, profD.path, "Label should have initial value"); + is(input.tooltipText, profD.path, "Label tooltip should have initial value"); + + input = gManagerWindow.document.getAnonymousElementByAttribute(settings[7], "anonid", "input"); + is(input.value, profD.path, "Label value should have initial value"); + is(input.tooltipText, profD.path, "Label tooltip should have initial value"); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); + +// Tests bindings with existing prefs. +add_test(function() { + observer.checkHidden("inlinesettings1@tests.mozilla.org"); + + // Ensure these prefs are set. They should be set above, but somebody might + // change the tests above. + Services.prefs.setBoolPref("extensions.inlinesettings3.radioBool", false); + Services.prefs.setIntPref("extensions.inlinesettings3.radioInt", 6); + Preferences.set("extensions.inlinesettings3.radioString", "kilo \u338F"); + Services.prefs.setIntPref("extensions.inlinesettings3.menulist", 9); + + var addon = get_addon_element(gManagerWindow, "inlinesettings3@tests.mozilla.org"); + addon.parentNode.ensureElementIsVisible(addon); + + var button = gManagerWindow.document.getAnonymousElementByAttribute(addon, "anonid", "preferences-btn"); + EventUtils.synthesizeMouseAtCenter(button, { clickCount: 1 }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + observer.checkDisplayed("inlinesettings3@tests.mozilla.org"); + + var grid = gManagerWindow.document.getElementById("detail-grid"); + var settings = grid.querySelectorAll("rows > setting"); + + var radios = settings[0].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + is(radios[1].selected, true, "Correct radio button should be selected"); + + radios = settings[1].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + isnot(radios[1].selected, true, "Correct radio button should be selected"); + is(radios[2].selected, true, "Correct radio button should be selected"); + + radios = settings[2].getElementsByTagName("radio"); + isnot(radios[0].selected, true, "Correct radio button should be selected"); + isnot(radios[1].selected, true, "Correct radio button should be selected"); + is(radios[2].selected, true, "Correct radio button should be selected"); + + var input = settings[3].firstElementChild; + is(input.value, "9", "Menulist should have initial value"); + + gCategoryUtilities.openType("extension", run_next_test); + }); +}); |