|
1 /* vim: set ts=2 et sw=2 tw=80: */ |
|
2 /* Any copyright is dedicated to the Public Domain. |
|
3 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
4 /* Bug 699130 */ |
|
5 |
|
6 "use strict"; |
|
7 |
|
8 function test() |
|
9 { |
|
10 waitForExplicitFinish(); |
|
11 |
|
12 gBrowser.selectedTab = gBrowser.addTab(); |
|
13 gBrowser.selectedBrowser.addEventListener("load", function onLoad() { |
|
14 gBrowser.selectedBrowser.removeEventListener("load", onLoad, true); |
|
15 openScratchpad(runTests); |
|
16 }, true); |
|
17 |
|
18 content.location = "data:text/html,test Edit menu updates Scratchpad - bug 699130"; |
|
19 } |
|
20 |
|
21 function runTests() |
|
22 { |
|
23 let sp = gScratchpadWindow.Scratchpad; |
|
24 let doc = gScratchpadWindow.document; |
|
25 let winUtils = gScratchpadWindow.QueryInterface(Ci.nsIInterfaceRequestor). |
|
26 getInterface(Ci.nsIDOMWindowUtils); |
|
27 let OS = Services.appinfo.OS; |
|
28 |
|
29 info("will test the Edit menu"); |
|
30 |
|
31 let pass = 0; |
|
32 |
|
33 sp.setText("bug 699130: hello world! (edit menu)"); |
|
34 |
|
35 let editMenu = doc.getElementById("sp-edit-menu"); |
|
36 ok(editMenu, "the Edit menu"); |
|
37 let menubar = editMenu.parentNode; |
|
38 ok(menubar, "menubar found"); |
|
39 |
|
40 let editMenuIndex = -1; |
|
41 for (let i = 0; i < menubar.children.length; i++) { |
|
42 if (menubar.children[i] === editMenu) { |
|
43 editMenuIndex = i; |
|
44 break; |
|
45 } |
|
46 } |
|
47 isnot(editMenuIndex, -1, "Edit menu index is correct"); |
|
48 |
|
49 let menuPopup = editMenu.menupopup; |
|
50 ok(menuPopup, "the Edit menupopup"); |
|
51 let cutItem = doc.getElementById("menu_cut"); |
|
52 ok(cutItem, "the Cut menuitem"); |
|
53 let pasteItem = doc.getElementById("menu_paste"); |
|
54 ok(pasteItem, "the Paste menuitem"); |
|
55 |
|
56 let anchor = doc.documentElement; |
|
57 let isContextMenu = false; |
|
58 |
|
59 let openMenu = function(aX, aY, aCallback) { |
|
60 if (!editMenu || OS != "Darwin") { |
|
61 menuPopup.addEventListener("popupshown", function onPopupShown() { |
|
62 menuPopup.removeEventListener("popupshown", onPopupShown, false); |
|
63 executeSoon(aCallback); |
|
64 }, false); |
|
65 } |
|
66 |
|
67 executeSoon(function() { |
|
68 if (editMenu) { |
|
69 if (OS == "Darwin") { |
|
70 winUtils.forceUpdateNativeMenuAt(editMenuIndex); |
|
71 executeSoon(aCallback); |
|
72 } else { |
|
73 editMenu.open = true; |
|
74 } |
|
75 } else { |
|
76 menuPopup.openPopup(anchor, "overlap", aX, aY, isContextMenu, false); |
|
77 } |
|
78 }); |
|
79 }; |
|
80 |
|
81 let closeMenu = function(aCallback) { |
|
82 if (!editMenu || OS != "Darwin") { |
|
83 menuPopup.addEventListener("popuphidden", function onPopupHidden() { |
|
84 menuPopup.removeEventListener("popuphidden", onPopupHidden, false); |
|
85 executeSoon(aCallback); |
|
86 }, false); |
|
87 } |
|
88 |
|
89 executeSoon(function() { |
|
90 if (editMenu) { |
|
91 if (OS == "Darwin") { |
|
92 winUtils.forceUpdateNativeMenuAt(editMenuIndex); |
|
93 executeSoon(aCallback); |
|
94 } else { |
|
95 editMenu.open = false; |
|
96 } |
|
97 } else { |
|
98 menuPopup.hidePopup(); |
|
99 } |
|
100 }); |
|
101 }; |
|
102 |
|
103 let firstShow = function() { |
|
104 ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled"); |
|
105 closeMenu(firstHide); |
|
106 }; |
|
107 |
|
108 let firstHide = function() { |
|
109 sp.editor.setSelection({ line: 0, ch: 0 }, { line: 0, ch: 10 }); |
|
110 openMenu(11, 11, showAfterSelect); |
|
111 }; |
|
112 |
|
113 let showAfterSelect = function() { |
|
114 ok(!cutItem.hasAttribute("disabled"), "cut menuitem is enabled after select"); |
|
115 closeMenu(hideAfterSelect); |
|
116 }; |
|
117 |
|
118 let hideAfterSelect = function() { |
|
119 sp.editor.on("change", onCut); |
|
120 waitForFocus(function () { |
|
121 let selectedText = sp.editor.getSelection(); |
|
122 ok(selectedText.length > 0, "non-empty selected text will be cut"); |
|
123 |
|
124 EventUtils.synthesizeKey("x", {accelKey: true}, gScratchpadWindow); |
|
125 }, gScratchpadWindow); |
|
126 }; |
|
127 |
|
128 let onCut = function() { |
|
129 sp.editor.off("change", onCut); |
|
130 openMenu(12, 12, showAfterCut); |
|
131 }; |
|
132 |
|
133 let showAfterCut = function() { |
|
134 ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled after cut"); |
|
135 ok(!pasteItem.hasAttribute("disabled"), "paste menuitem is enabled after cut"); |
|
136 closeMenu(hideAfterCut); |
|
137 }; |
|
138 |
|
139 let hideAfterCut = function() { |
|
140 sp.editor.on("change", onPaste); |
|
141 waitForFocus(function () { |
|
142 EventUtils.synthesizeKey("v", {accelKey: true}, gScratchpadWindow); |
|
143 }, gScratchpadWindow); |
|
144 }; |
|
145 |
|
146 let onPaste = function() { |
|
147 sp.editor.off("change", onPaste); |
|
148 openMenu(13, 13, showAfterPaste); |
|
149 }; |
|
150 |
|
151 let showAfterPaste = function() { |
|
152 ok(cutItem.hasAttribute("disabled"), "cut menuitem is disabled after paste"); |
|
153 ok(!pasteItem.hasAttribute("disabled"), "paste menuitem is enabled after paste"); |
|
154 closeMenu(hideAfterPaste); |
|
155 }; |
|
156 |
|
157 let hideAfterPaste = function() { |
|
158 if (pass == 0) { |
|
159 pass++; |
|
160 testContextMenu(); |
|
161 } else { |
|
162 finish(); |
|
163 } |
|
164 }; |
|
165 |
|
166 let testContextMenu = function() { |
|
167 info("will test the context menu"); |
|
168 |
|
169 editMenu = null; |
|
170 isContextMenu = true; |
|
171 |
|
172 menuPopup = doc.getElementById("scratchpad-text-popup"); |
|
173 ok(menuPopup, "the context menupopup"); |
|
174 cutItem = doc.getElementById("cMenu_cut"); |
|
175 ok(cutItem, "the Cut menuitem"); |
|
176 pasteItem = doc.getElementById("cMenu_paste"); |
|
177 ok(pasteItem, "the Paste menuitem"); |
|
178 |
|
179 sp.setText("bug 699130: hello world! (context menu)"); |
|
180 openMenu(10, 10, firstShow); |
|
181 }; |
|
182 |
|
183 openMenu(10, 10, firstShow); |
|
184 } |