michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: /* Bug 699130 */ michael@0: michael@0: "use strict"; michael@0: michael@0: function test() michael@0: { michael@0: waitForExplicitFinish(); michael@0: michael@0: gBrowser.selectedTab = gBrowser.addTab(); michael@0: gBrowser.selectedBrowser.addEventListener("load", function onLoad() { michael@0: gBrowser.selectedBrowser.removeEventListener("load", onLoad, true); michael@0: openScratchpad(runTests); michael@0: }, true); michael@0: michael@0: content.location = "data:text/html,test Edit menu updates Scratchpad - bug 699130"; michael@0: } michael@0: michael@0: function runTests() michael@0: { michael@0: let sp = gScratchpadWindow.Scratchpad; michael@0: let doc = gScratchpadWindow.document; michael@0: let winUtils = gScratchpadWindow.QueryInterface(Ci.nsIInterfaceRequestor). michael@0: getInterface(Ci.nsIDOMWindowUtils); michael@0: let OS = Services.appinfo.OS; michael@0: michael@0: info("will test the Edit menu"); michael@0: michael@0: let pass = 0; michael@0: michael@0: sp.setText("bug 699130: hello world! (edit menu)"); michael@0: michael@0: let editMenu = doc.getElementById("sp-edit-menu"); michael@0: ok(editMenu, "the Edit menu"); michael@0: let menubar = editMenu.parentNode; michael@0: ok(menubar, "menubar found"); michael@0: michael@0: let editMenuIndex = -1; michael@0: for (let i = 0; i < menubar.children.length; i++) { michael@0: if (menubar.children[i] === editMenu) { michael@0: editMenuIndex = i; michael@0: break; michael@0: } michael@0: } michael@0: isnot(editMenuIndex, -1, "Edit menu index is correct"); michael@0: michael@0: let menuPopup = editMenu.menupopup; michael@0: ok(menuPopup, "the Edit menupopup"); michael@0: let cutItem = doc.getElementById("menu_cut"); michael@0: ok(cutItem, "the Cut menuitem"); michael@0: let pasteItem = doc.getElementById("menu_paste"); michael@0: ok(pasteItem, "the Paste menuitem"); michael@0: michael@0: let anchor = doc.documentElement; michael@0: let isContextMenu = false; michael@0: michael@0: let openMenu = function(aX, aY, aCallback) { michael@0: if (!editMenu || OS != "Darwin") { michael@0: menuPopup.addEventListener("popupshown", function onPopupShown() { michael@0: menuPopup.removeEventListener("popupshown", onPopupShown, false); michael@0: executeSoon(aCallback); michael@0: }, false); michael@0: } michael@0: michael@0: executeSoon(function() { michael@0: if (editMenu) { michael@0: if (OS == "Darwin") { michael@0: winUtils.forceUpdateNativeMenuAt(editMenuIndex); michael@0: executeSoon(aCallback); michael@0: } else { michael@0: editMenu.open = true; michael@0: } michael@0: } else { michael@0: menuPopup.openPopup(anchor, "overlap", aX, aY, isContextMenu, false); michael@0: } michael@0: }); michael@0: }; michael@0: michael@0: let closeMenu = function(aCallback) { michael@0: if (!editMenu || OS != "Darwin") { michael@0: menuPopup.addEventListener("popuphidden", function onPopupHidden() { michael@0: menuPopup.removeEventListener("popuphidden", onPopupHidden, false); michael@0: executeSoon(aCallback); michael@0: }, false); michael@0: } michael@0: michael@0: executeSoon(function() { michael@0: if (editMenu) { michael@0: if (OS == "Darwin") { michael@0: winUtils.forceUpdateNativeMenuAt(editMenuIndex); michael@0: executeSoon(aCallback); michael@0: } else { michael@0: editMenu.open = false; michael@0: } michael@0: } else { michael@0: menuPopup.hidePopup(); michael@0: } michael@0: }); michael@0: }; michael@0: michael@0: let firstShow = function() { michael@0: ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled"); michael@0: closeMenu(firstHide); michael@0: }; michael@0: michael@0: let firstHide = function() { michael@0: sp.editor.setSelection({ line: 0, ch: 0 }, { line: 0, ch: 10 }); michael@0: openMenu(11, 11, showAfterSelect); michael@0: }; michael@0: michael@0: let showAfterSelect = function() { michael@0: ok(!cutItem.hasAttribute("disabled"), "cut menuitem is enabled after select"); michael@0: closeMenu(hideAfterSelect); michael@0: }; michael@0: michael@0: let hideAfterSelect = function() { michael@0: sp.editor.on("change", onCut); michael@0: waitForFocus(function () { michael@0: let selectedText = sp.editor.getSelection(); michael@0: ok(selectedText.length > 0, "non-empty selected text will be cut"); michael@0: michael@0: EventUtils.synthesizeKey("x", {accelKey: true}, gScratchpadWindow); michael@0: }, gScratchpadWindow); michael@0: }; michael@0: michael@0: let onCut = function() { michael@0: sp.editor.off("change", onCut); michael@0: openMenu(12, 12, showAfterCut); michael@0: }; michael@0: michael@0: let showAfterCut = function() { michael@0: ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled after cut"); michael@0: ok(!pasteItem.hasAttribute("disabled"), "paste menuitem is enabled after cut"); michael@0: closeMenu(hideAfterCut); michael@0: }; michael@0: michael@0: let hideAfterCut = function() { michael@0: sp.editor.on("change", onPaste); michael@0: waitForFocus(function () { michael@0: EventUtils.synthesizeKey("v", {accelKey: true}, gScratchpadWindow); michael@0: }, gScratchpadWindow); michael@0: }; michael@0: michael@0: let onPaste = function() { michael@0: sp.editor.off("change", onPaste); michael@0: openMenu(13, 13, showAfterPaste); michael@0: }; michael@0: michael@0: let showAfterPaste = function() { michael@0: ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled after paste"); michael@0: ok(!pasteItem.hasAttribute("disabled"), "paste menuitem is enabled after paste"); michael@0: closeMenu(hideAfterPaste); michael@0: }; michael@0: michael@0: let hideAfterPaste = function() { michael@0: if (pass == 0) { michael@0: pass++; michael@0: testContextMenu(); michael@0: } else { michael@0: finish(); michael@0: } michael@0: }; michael@0: michael@0: let testContextMenu = function() { michael@0: info("will test the context menu"); michael@0: michael@0: editMenu = null; michael@0: isContextMenu = true; michael@0: michael@0: menuPopup = doc.getElementById("scratchpad-text-popup"); michael@0: ok(menuPopup, "the context menupopup"); michael@0: cutItem = doc.getElementById("cMenu_cut"); michael@0: ok(cutItem, "the Cut menuitem"); michael@0: pasteItem = doc.getElementById("cMenu_paste"); michael@0: ok(pasteItem, "the Paste menuitem"); michael@0: michael@0: sp.setText("bug 699130: hello world! (context menu)"); michael@0: openMenu(10, 10, firstShow); michael@0: }; michael@0: michael@0: openMenu(10, 10, firstShow); michael@0: }