forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			203 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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"));
 | |
| };
 | 
