diff options
Diffstat (limited to 'toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js')
-rw-r--r-- | toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js b/toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js new file mode 100644 index 0000000000..e155a9c87e --- /dev/null +++ b/toolkit/components/viewsource/test/browser/browser_viewsourceprefs.js @@ -0,0 +1,203 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var plaintextURL = "data:text/plain,hello+world"; +var htmlURL = "about:mozilla"; + +add_setup(async function () { + registerCleanupFunction(function () { + SpecialPowers.clearUserPref("view_source.tab_size"); + SpecialPowers.clearUserPref("view_source.wrap_long_lines"); + SpecialPowers.clearUserPref("view_source.syntax_highlight"); + }); +}); + +add_task(async function () { + await exercisePrefs(plaintextURL, false); + await exercisePrefs(htmlURL, true); +}); + +const contextMenu = document.getElementById("contentAreaContextMenu"); +async function openContextMenu(browser) { + info("Opening context menu"); + const popupShownPromise = BrowserTestUtils.waitForEvent( + contextMenu, + "popupshown" + ); + await BrowserTestUtils.synthesizeMouseAtCenter( + "html", + { type: "contextmenu", button: 2 }, + browser + ); + await popupShownPromise; + info("Opened context menu"); +} + +async function closeContextMenu() { + const popupHiddenPromise = BrowserTestUtils.waitForEvent( + contextMenu, + "popuphidden" + ); + contextMenu.hidePopup(); + await popupHiddenPromise; +} + +async function simulateClick(id) { + const popupHiddenPromise = BrowserTestUtils.waitForEvent( + contextMenu, + "popuphidden" + ); + contextMenu.activateItem(document.getElementById(id)); + await popupHiddenPromise; +} + +function getAttribute(id, attribute) { + let item = document.getElementById(id); + return item.getAttribute(attribute); +} + +var exercisePrefs = async function (source, highlightable) { + let tab = await openDocument(source); + let browser = tab.linkedBrowser; + + const wrapMenuItem = "context-viewsource-wrapLongLines"; + const syntaxMenuItem = "context-viewsource-highlightSyntax"; + + // Test the default states of these menu items. + await checkStyle(browser, "-moz-tab-size", 4); + await openContextMenu(browser); + await checkStyle(browser, "white-space", "pre"); + await checkHighlight(browser, highlightable); + is( + getAttribute(wrapMenuItem, "checked"), + "false", + "Wrap menu item not checked by default" + ); + is( + getAttribute(syntaxMenuItem, "checked"), + "true", + "Syntax menu item checked by default" + ); + await closeContextMenu(); + + // Next, test that the Wrap Long Lines menu item works. + let prefReady = waitForPrefChange("view_source.wrap_long_lines"); + await openContextMenu(browser); + await simulateClick(wrapMenuItem); + await openContextMenu(browser); + await checkStyle(browser, "white-space", "pre-wrap"); + is(getAttribute(wrapMenuItem, "checked"), "true", "Wrap menu item checked"); + await prefReady; + is( + SpecialPowers.getBoolPref("view_source.wrap_long_lines"), + true, + "Wrap pref set" + ); + await closeContextMenu(); + + prefReady = waitForPrefChange("view_source.wrap_long_lines"); + await openContextMenu(browser); + await simulateClick(wrapMenuItem); + await openContextMenu(browser); + await checkStyle(browser, "white-space", "pre"); + is( + getAttribute(wrapMenuItem, "checked"), + "false", + "Wrap menu item unchecked" + ); + await prefReady; + is( + SpecialPowers.getBoolPref("view_source.wrap_long_lines"), + false, + "Wrap pref set" + ); + await closeContextMenu(); + + // Check that the Syntax Highlighting menu item works. + prefReady = waitForPrefChange("view_source.syntax_highlight"); + await openContextMenu(browser); + await simulateClick(syntaxMenuItem); + await openContextMenu(browser); + await checkHighlight(browser, false); + is( + getAttribute(syntaxMenuItem, "checked"), + "false", + "Syntax menu item unchecked" + ); + await prefReady; + is( + SpecialPowers.getBoolPref("view_source.syntax_highlight"), + false, + "Syntax highlighting pref set" + ); + await closeContextMenu(); + + prefReady = waitForPrefChange("view_source.syntax_highlight"); + await openContextMenu(browser); + await simulateClick(syntaxMenuItem); + await openContextMenu(browser); + await checkHighlight(browser, highlightable); + is( + getAttribute(syntaxMenuItem, "checked"), + "true", + "Syntax menu item checked" + ); + await prefReady; + is( + SpecialPowers.getBoolPref("view_source.syntax_highlight"), + true, + "Syntax highlighting pref set" + ); + await closeContextMenu(); + gBrowser.removeTab(tab); + + // Open a new view-source window to check that the prefs are obeyed. + SpecialPowers.setIntPref("view_source.tab_size", 2); + SpecialPowers.setBoolPref("view_source.wrap_long_lines", true); + SpecialPowers.setBoolPref("view_source.syntax_highlight", false); + + tab = await openDocument(source); + browser = tab.linkedBrowser; + + await checkStyle(browser, "-moz-tab-size", 2); + await openContextMenu(browser); + await checkStyle(browser, "white-space", "pre-wrap"); + await checkHighlight(browser, false); + is(getAttribute(wrapMenuItem, "checked"), "true", "Wrap menu item checked"); + is( + getAttribute(syntaxMenuItem, "checked"), + "false", + "Syntax menu item unchecked" + ); + + SpecialPowers.clearUserPref("view_source.tab_size"); + SpecialPowers.clearUserPref("view_source.wrap_long_lines"); + SpecialPowers.clearUserPref("view_source.syntax_highlight"); + + await closeContextMenu(); + gBrowser.removeTab(tab); +}; + +var checkStyle = async function (browser, styleProperty, expected) { + let value = await SpecialPowers.spawn( + browser, + [styleProperty], + async function (styleProperty) { + let style = content.getComputedStyle(content.document.body); + return style.getPropertyValue(styleProperty); + } + ); + is(value, "" + expected, "Correct value of " + styleProperty); +}; + +var checkHighlight = async function (browser, expected) { + let highlighted = await SpecialPowers.spawn(browser, [], async function () { + let spans = content.document.getElementsByTagName("span"); + return Array.prototype.some.call(spans, span => { + let style = content.getComputedStyle(span); + return style.getPropertyValue("color") !== "rgb(0, 0, 0)"; + }); + }); + is(highlighted, expected, "Syntax highlighting " + (expected ? "on" : "off")); +}; |