gecko/browser/devtools/scratchpad/test/browser_scratchpad_edit_ui_updates.js

207 lines
6.1 KiB
JavaScript

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