1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/base/content/test/general/test_contextmenu_input.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,338 @@ 1.4 +<!DOCTYPE HTML> 1.5 +<html> 1.6 +<head> 1.7 + <title>Tests for browser context menu</title> 1.8 + <script type="text/javascript" src="/MochiKit/packed.js"></script> 1.9 + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> 1.10 + <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script> 1.11 + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 1.12 +</head> 1.13 +<body> 1.14 +Browser context menu tests for input. 1.15 +<p id="display"></p> 1.16 + 1.17 +<div id="content"> 1.18 +</div> 1.19 + 1.20 +<pre id="test"> 1.21 +<script type="text/javascript" src="contextmenu_common.js"></script> 1.22 +<script class="testbody" type="text/javascript"> 1.23 + 1.24 +const Ci = SpecialPowers.Ci; 1.25 + 1.26 +/* 1.27 + * runTest 1.28 + * 1.29 + * Called by a popupshowing event handler. Each test checks for expected menu 1.30 + * contents, closes the popup, and finally triggers the popup on a new element 1.31 + * (thus kicking off another cycle). 1.32 + * 1.33 + */ 1.34 +function runTest(testNum) { 1.35 + ok(true, "Starting test #" + testNum); 1.36 + 1.37 + switch (testNum) { 1.38 + case 1: 1.39 + openContextMenuFor(input); // Invoke context menu for next test. 1.40 + break; 1.41 + 1.42 + case 2: 1.43 + // Context menu for text input field. 1.44 + checkContextMenu(["context-undo", false, 1.45 + "---", null, 1.46 + "context-cut", false, 1.47 + "context-copy", false, 1.48 + "context-paste", null, // ignore clipboard state 1.49 + "context-delete", false, 1.50 + "---", null, 1.51 + "context-selectall", false, 1.52 + "---", null, 1.53 + "spell-check-enabled", true, 1.54 + "---", null, 1.55 + "context-inspect", true]); 1.56 + closeContextMenu(); 1.57 + input.setAttribute('spellcheck', 'true'); 1.58 + openContextMenuFor(input); // Invoke context menu for next test. 1.59 + break; 1.60 + 1.61 + case 3: 1.62 + var value = SpecialPowers.Services.appinfo.OS != "Darwin"; 1.63 + // Context menu for spell-check input. 1.64 + checkContextMenu(["context-undo", value, 1.65 + "---", null, 1.66 + "context-cut", value, 1.67 + "context-copy", value, 1.68 + "context-paste", null, // ignore clipboard state 1.69 + "context-delete", value, 1.70 + "---", null, 1.71 + "context-selectall", value, 1.72 + "---", null, 1.73 + "spell-check-enabled", true, 1.74 + "spell-dictionaries", true, 1.75 + [/*"spell-check-dictionary-en-US", true,*/ 1.76 + "---", null, 1.77 + "spell-add-dictionaries", true], null, 1.78 + "---", null, 1.79 + "context-inspect", true]); 1.80 + 1.81 + closeContextMenu(); 1.82 + input.removeAttribute('spellcheck'); 1.83 + openContextMenuFor(inputspellwrong); // Invoke context menu for next test. 1.84 + break; 1.85 + 1.86 + case 4: 1.87 + var value = SpecialPowers.Services.appinfo.OS != "Darwin"; 1.88 + // Context menu for spell-check input with a unknwon word. 1.89 + checkContextMenu([/*"*prodigality", true,*/ // spelling suggestion 1.90 + /*"spell-add-to-dictionary", true,*/ 1.91 + /*"---", null,*/ 1.92 + "context-undo", value, 1.93 + "---", null, 1.94 + "context-cut", value, 1.95 + "context-copy", value, 1.96 + "context-paste", null, // ignore clipboard state 1.97 + "context-delete", value, 1.98 + "---", null, 1.99 + "context-selectall", true, 1.100 + "---", null, 1.101 + "spell-check-enabled", true, 1.102 + "spell-dictionaries", true, 1.103 + [/*"spell-check-dictionary-en-US", true,*/ 1.104 + "---", null, 1.105 + "spell-add-dictionaries", true], null, 1.106 + "---", null, 1.107 + "context-inspect", true]); 1.108 + 1.109 + closeContextMenu(); 1.110 + openContextMenuFor(inputspellcorrect); // Invoke context menu for next test. 1.111 + break; 1.112 + 1.113 + case 5: 1.114 + var value = SpecialPowers.Services.appinfo.OS != "Darwin"; 1.115 + // Context menu for spell-check input with a known word. 1.116 + checkContextMenu(["context-undo", value, 1.117 + "---", null, 1.118 + "context-cut", value, 1.119 + "context-copy", value, 1.120 + "context-paste", null, // ignore clipboard state 1.121 + "context-delete", value, 1.122 + "---", null, 1.123 + "context-selectall", true, 1.124 + "---", null, 1.125 + "spell-check-enabled", true, 1.126 + "spell-dictionaries", true, 1.127 + [/*"spell-check-dictionary-en-US", true,*/ 1.128 + "---", null, 1.129 + "spell-add-dictionaries", true], null, 1.130 + "---", null, 1.131 + "context-inspect", true]); 1.132 + 1.133 + closeContextMenu(); 1.134 + input.disabled = true; 1.135 + openContextMenuFor(input); // Invoke context menu for next test. 1.136 + break; 1.137 + 1.138 + case 6: 1.139 + // Context menu for disabled input. 1.140 + checkContextMenu(["context-undo", false, 1.141 + "---", null, 1.142 + "context-cut", false, 1.143 + "context-copy", false, 1.144 + "context-paste", null, // ignore clipboard state 1.145 + "context-delete", false, 1.146 + "---", null, 1.147 + "context-selectall", true, 1.148 + "---", null, 1.149 + "spell-check-enabled", true, 1.150 + "---", null, 1.151 + "context-inspect", true]); 1.152 + 1.153 + closeContextMenu(); 1.154 + input.disabled = false; 1.155 + input.type = 'password'; 1.156 + openContextMenuFor(input); // Invoke context menu for next test. 1.157 + break; 1.158 + 1.159 + case 7: // password 1.160 + case 8: // email 1.161 + case 9: // url 1.162 + case 10: // tel 1.163 + // Context menu for tel, password, email and url input fields. 1.164 + checkContextMenu(["context-undo", false, 1.165 + "---", null, 1.166 + "context-cut", false, 1.167 + "context-copy", false, 1.168 + "context-paste", null, // ignore clipboard state 1.169 + "context-delete", false, 1.170 + "---", null, 1.171 + "context-selectall", false, 1.172 + "---", null, 1.173 + "context-inspect", true]); 1.174 + 1.175 + closeContextMenu(); 1.176 + 1.177 + if (testNum == 7) { 1.178 + input.type = 'email'; 1.179 + } else if (testNum == 8) { 1.180 + input.type = 'url'; 1.181 + } else if (testNum == 9) { 1.182 + input.type = 'tel'; 1.183 + } else if (testNum == 10) { 1.184 + input.type = 'date'; 1.185 + } 1.186 + 1.187 + openContextMenuFor(input); // Invoke context menu for next test. 1.188 + break; 1.189 + 1.190 + case 11: // type='date' 1.191 + case 12: // type='time' 1.192 + case 13: // type='number' 1.193 + case 14: // type='color' 1.194 + case 15: // type='range' 1.195 + checkContextMenu(["context-back", false, 1.196 + "context-forward", false, 1.197 + "context-reload", true, 1.198 + "---", null, 1.199 + "context-bookmarkpage", true, 1.200 + "context-savepage", true, 1.201 + "---", null, 1.202 + "context-viewbgimage", false, 1.203 + "context-selectall", null, 1.204 + "---", null, 1.205 + "context-viewsource", true, 1.206 + "context-viewinfo", true, 1.207 + "---", null, 1.208 + "context-inspect", true]); 1.209 + closeContextMenu(); 1.210 + 1.211 + if (testNum == 11) { 1.212 + input.type = 'time'; 1.213 + } else if (testNum == 12) { 1.214 + input.type = 'number'; 1.215 + } else if (testNum == 13) { 1.216 + input.type = 'color'; 1.217 + } else if (testNum == 14) { 1.218 + input.type = 'range'; 1.219 + } else { 1.220 + input.type = 'search'; 1.221 + } 1.222 + 1.223 + openContextMenuFor(input); 1.224 + break; 1.225 + 1.226 + case 16: // type='search' 1.227 + // Context menu for search input fields. 1.228 + checkContextMenu(["context-undo", false, 1.229 + "---", null, 1.230 + "context-cut", false, 1.231 + "context-copy", false, 1.232 + "context-paste", null, // ignore clipboard state 1.233 + "context-delete", false, 1.234 + "---", null, 1.235 + "context-selectall", false, 1.236 + "---", null, 1.237 + "spell-check-enabled", true, 1.238 + "---", null, 1.239 + "context-inspect", true]); 1.240 + 1.241 + closeContextMenu(); 1.242 + 1.243 + // Add some todos to make sure all input fields got a test. 1.244 + var todos = [ "datetime", "month", "week", "datetime-local" ]; 1.245 + todos.forEach(function(type) { 1.246 + input.type = type; 1.247 + todo_is(input.type, type, "TODO: add test for " + type + " input fields"); 1.248 + }); 1.249 + 1.250 + input.type = 'text'; 1.251 + input.readOnly = true; 1.252 + openContextMenuFor(input); 1.253 + break; 1.254 + 1.255 + case 17: 1.256 + // Context menu for a read-only input. 1.257 + checkContextMenu(["context-undo", false, 1.258 + "---", null, 1.259 + "context-cut", false, 1.260 + "context-copy", false, 1.261 + "context-paste", null, // ignore clipboard state 1.262 + "context-delete", false, 1.263 + "---", null, 1.264 + "context-selectall", false, 1.265 + "---", null, 1.266 + "context-inspect", true]); 1.267 + closeContextMenu(); 1.268 + 1.269 + // Clean-up. 1.270 + subwindow.close(); 1.271 + SimpleTest.finish(); 1.272 + return; 1.273 + 1.274 + default: 1.275 + ok(false, "Unexpected invocation of test #" + testNum); 1.276 + subwindow.close(); 1.277 + SimpleTest.finish(); 1.278 + return; 1.279 + } 1.280 + 1.281 +} 1.282 + 1.283 + 1.284 +var gTestNum = 1; 1.285 +var subwindow, chromeWin, contextMenu; 1.286 +var input, inputspellwrong, inputspellcorrect; 1.287 + 1.288 +function startTest() { 1.289 + chromeWin = SpecialPowers.wrap(subwindow) 1.290 + .QueryInterface(Ci.nsIInterfaceRequestor) 1.291 + .getInterface(Ci.nsIWebNavigation) 1.292 + .QueryInterface(Ci.nsIDocShellTreeItem) 1.293 + .rootTreeItem 1.294 + .QueryInterface(Ci.nsIInterfaceRequestor) 1.295 + .getInterface(Ci.nsIDOMWindow) 1.296 + .QueryInterface(Ci.nsIDOMChromeWindow); 1.297 + contextMenu = chromeWin.document.getElementById("contentAreaContextMenu"); 1.298 + ok(contextMenu, "Got context menu XUL"); 1.299 + 1.300 + if (chromeWin.document.getElementById("Browser:Stop").getAttribute("disabled") != "true") { 1.301 + SimpleTest.executeSoon(startTest); 1.302 + return; 1.303 + } 1.304 + 1.305 + var inputs = subwindow.document.getElementsByTagName('input'); 1.306 + input = inputs[0]; 1.307 + inputspellwrong = inputs[1]; 1.308 + inputspellcorrect = inputs[2]; 1.309 + 1.310 + contextMenu.addEventListener("popupshown", function() { runTest(++gTestNum); }, false); 1.311 + runTest(1); 1.312 +} 1.313 + 1.314 +// We open this in a separate window, because the Mochitests run inside a frame. 1.315 +// The frame causes an extra menu item, and prevents running the test 1.316 +// standalone (ie, clicking the test name in the Mochitest window) to see 1.317 +// success/failure messages. 1.318 +var painted = false, loaded = false; 1.319 + 1.320 +function waitForEvents(event) 1.321 +{ 1.322 + if (event.type == "MozAfterPaint") 1.323 + painted = true; 1.324 + else if (event.type == "load") 1.325 + loaded = true; 1.326 + if (painted && loaded) { 1.327 + subwindow.removeEventListener("MozAfterPaint", waitForEvents, false); 1.328 + subwindow.onload = null; 1.329 + startTest(); 1.330 + } 1.331 +} 1.332 + 1.333 +var subwindow = window.open("data:text/html,<!DOCTYPE html><input><input spellcheck='true' value='prodkjfgigrty'><input spellcheck='true' value='foo'><input readonly spellcheck='false'>", "contextmenu-subtext", "width=600,height=700"); 1.334 +subwindow.addEventListener("MozAfterPaint", waitForEvents, false); 1.335 +subwindow.onload = waitForEvents; 1.336 + 1.337 +SimpleTest.waitForExplicitFinish(); 1.338 +</script> 1.339 +</pre> 1.340 +</body> 1.341 +</html>