rename from browser/base/content/test/general/test_contextmenu_input.html
rename to browser/base/content/test/general/browser_contextmenu_input.js
--- a/browser/base/content/test/general/test_contextmenu_input.html
+++ b/browser/base/content/test/general/browser_contextmenu_input.js
@@ -1,364 +1,303 @@
-<!DOCTYPE HTML>
-<html>
-<head>
- <title>Tests for browser context menu</title>
- <script type="text/javascript" src="/MochiKit/packed.js"></script>
- <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-Browser context menu tests for input.
-<p id="display"></p>
+"use strict";
-<div id="content">
-</div>
+let contextMenu;
+add_task(function* test_setup() {
+ const example_base = "http://example.com/browser/browser/base/content/test/general/";
+ const url = example_base + "subtst_contextmenu_input.html";
+ yield BrowserTestUtils.openNewForegroundTab(gBrowser, url);
+
+ const chrome_base = "chrome://mochitests/content/browser/browser/base/content/test/general/";
+ const contextmenu_common = chrome_base + "contextmenu_common.js";
+ Services.scriptloader.loadSubScript(contextmenu_common, this);
+});
-<pre id="test">
-<script type="text/javascript" src="contextmenu_common.js"></script>
-<script class="testbody" type="text/javascript">
-
-const Ci = SpecialPowers.Ci;
-
-/*
- * runTest
- *
- * Called by a popupshowing event handler. Each test checks for expected menu
- * contents, closes the popup, and finally triggers the popup on a new element
- * (thus kicking off another cycle).
- *
- */
-function runTest(testNum) {
- ok(true, "Starting test #" + testNum);
-
- switch (testNum) {
- case 1:
- openContextMenuFor(input); // Invoke context menu for next test.
- break;
+add_task(function* test_text_input() {
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", false,
+ "---", null,
+ "spell-check-enabled", true]);
+});
- case 2:
- // Context menu for text input field.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", false,
- "---", null,
- "spell-check-enabled", true,
- "---", null,
- "context-inspect", true]);
- closeContextMenu();
- input.setAttribute('spellcheck', 'true');
- // Invoke context menu for next test and wait for spell check to finish
- openContextMenuFor(input, false, true);
- break;
-
- case 3:
- var value = false;
- // Context menu for spell-check input.
- checkContextMenu(["context-undo", value,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", value,
- "---", null,
- "context-selectall", value,
- "---", null,
- "spell-check-enabled", true,
- "spell-dictionaries", true,
- ["spell-check-dictionary-en-US", true,
- "---", null,
- "spell-add-dictionaries", true], null,
- "---", null,
- "context-inspect", true]);
-
- closeContextMenu();
- input.removeAttribute('spellcheck');
- // Invoke context menu for next test and wait for spell check to finish
- openContextMenuFor(inputspellwrong, false, true);
- break;
+add_task(function* test_text_input_spellcheck() {
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", false,
+ "---", null,
+ "spell-check-enabled", true,
+ "spell-dictionaries", true,
+ ["spell-check-dictionary-en-US", true,
+ "---", null,
+ "spell-add-dictionaries", true], null],
+ {
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.setAttribute("spellcheck", "true");
+ });
+ },
+ waitForSpellCheck: true,
+ *postCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.removeAttribute("spellcheck");
+ });
+ }
+ }
+ );
+});
- case 4:
- var value = false;
- // Context menu for spell-check input with a unknwon word.
- checkContextMenu(["*prodigality", true, // spelling suggestion
- "spell-add-to-dictionary", true,
- "---", null,
- "context-undo", value,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", value,
- "---", null,
- "context-selectall", true,
- "---", null,
- "spell-check-enabled", true,
- "spell-dictionaries", true,
- ["spell-check-dictionary-en-US", true,
- "---", null,
- "spell-add-dictionaries", true], null,
- "---", null,
- "context-inspect", true]);
-
- closeContextMenu();
- // Invoke context menu for next test and wait for spell check to finish
- openContextMenuFor(inputspellcorrect, false, true);
- break;
-
- case 5:
- var value = false;
- // Context menu for spell-check input with a known word.
- checkContextMenu(["context-undo", value,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", value,
- "---", null,
- "context-selectall", true,
- "---", null,
- "spell-check-enabled", true,
- "spell-dictionaries", true,
- ["spell-check-dictionary-en-US", true,
- "---", null,
- "spell-add-dictionaries", true], null,
- "---", null,
- "context-inspect", true]);
+add_task(function* test_text_input_spellcheckwrong() {
+ yield test_contextmenu("#input2",
+ ["*prodigality", true, // spelling suggestion
+ "spell-add-to-dictionary", true,
+ "---", null,
+ "context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", true,
+ "---", null,
+ "spell-check-enabled", true,
+ "spell-dictionaries", true,
+ ["spell-check-dictionary-en-US", true,
+ "---", null,
+ "spell-add-dictionaries", true], null],
+ {waitForSpellCheck: true}
+ );
+});
- closeContextMenu();
- input.disabled = true;
- openContextMenuFor(input); // Invoke context menu for next test.
- break;
-
- case 6:
- // Context menu for disabled input.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", true,
- "---", null,
- "spell-check-enabled", true,
- "---", null,
- "context-inspect", true]);
+add_task(function* test_text_input_spellcheckcorrect() {
+ yield test_contextmenu("#input3",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", true,
+ "---", null,
+ "spell-check-enabled", true,
+ "spell-dictionaries", true,
+ ["spell-check-dictionary-en-US", true,
+ "---", null,
+ "spell-add-dictionaries", true], null],
+ {waitForSpellCheck: true}
+ );
+});
- closeContextMenu();
- input.disabled = false;
- input.type = 'password';
- openContextMenuFor(input); // Invoke context menu for next test.
- break;
-
- case 7: // password
- // Context menu for password input fields.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", false,
- "---", null,
- "fill-login", null,
- ["fill-login-no-logins", false,
- "---", null,
- "fill-login-saved-passwords", true], null,
- "---", null,
- "context-inspect", true]);
-
- closeContextMenu();
-
- input.type = 'email';
+add_task(function* test_text_input_disabled() {
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", true,
+ "---", null,
+ "spell-check-enabled", true],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.disabled = true;
+ input.clientTop; // force layout flush
+ });
+ },
+ *postCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.disabled = false;
+ });
+ }
+ }
+ );
+});
- openContextMenuFor(input); // Invoke context menu for next test.
- break;
-
- case 8: // email
- case 9: // url
- case 10: // tel
- case 11: // type='number'
- // Context menu for tel, email, url and number input fields.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", false,
- "---", null,
- "context-inspect", true]);
-
- closeContextMenu();
-
- if (testNum == 8) {
- input.type = 'url';
- } else if (testNum == 9) {
- input.type = 'tel';
- } else if (testNum == 10) {
- input.type = 'number';
- } else if (testNum == 11) {
- input.type = 'date';
- }
-
- openContextMenuFor(input); // Invoke context menu for next test.
- break;
+add_task(function* test_password_input() {
+ todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
+ " it should be disabled");
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", null,
+ "---", null,
+ "fill-login", null,
+ ["fill-login-no-logins", false,
+ "---", null,
+ "fill-login-saved-passwords", true], null],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = "password";
+ input.clientTop; // force layout flush
+ });
+ }
+ }
+ );
+});
- case 12: // type='date'
- case 13: // type='time'
- case 14: // type='color'
- case 15: // type='range'
- checkContextMenu(["context-navigation", null,
- ["context-back", false,
- "context-forward", false,
- "context-reload", true,
- "context-bookmarkpage", true], null,
- "---", null,
- "context-savepage", true,
- "---", null,
- "context-viewbgimage", false,
- "context-selectall", null,
- "---", null,
- "context-viewsource", true,
- "context-viewinfo", true,
- "---", null,
- "context-inspect", true]);
- closeContextMenu();
-
- if (testNum == 12) {
- input.type = 'time';
- } else if (testNum == 13) {
- input.type = 'color';
- } else if (testNum == 14) {
- input.type = 'range';
- } else {
- input.type = 'search';
+add_task(function* test_tel_email_url_number_input() {
+ todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
+ " it should be disabled");
+ for (let type of ["email", "url", "tel", "number"]) {
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", null],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, type, function*(type) {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = type;
+ input.clientTop; // force layout flush
+ });
}
-
- openContextMenuFor(input);
- break;
-
- case 16: // type='search'
- // Context menu for search input fields.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", false,
- "---", null,
- "spell-check-enabled", true,
- "---", null,
- "context-inspect", true]);
-
- closeContextMenu();
-
- // Add some todos to make sure all input fields got a test.
- var todos = [ "datetime", "month", "week", "datetime-local" ];
- todos.forEach(function(type) {
- input.type = type;
- todo_is(input.type, type, "TODO: add test for " + type + " input fields");
- });
+ }
+ );
+ }
+});
- input.type = 'text';
- input.readOnly = true;
- openContextMenuFor(input);
- break;
-
- case 17:
- // Context menu for a read-only input.
- checkContextMenu(["context-undo", false,
- "---", null,
- "context-cut", true,
- "context-copy", true,
- "context-paste", null, // ignore clipboard state
- "context-delete", false,
- "---", null,
- "context-selectall", false,
- "---", null,
- "context-inspect", true]);
- closeContextMenu();
-
- // Clean-up.
- subwindow.close();
- SimpleTest.finish();
- return;
-
- default:
- ok(false, "Unexpected invocation of test #" + testNum);
- subwindow.close();
- SimpleTest.finish();
- return;
+add_task(function* test_date_time_color_range_input() {
+ for (let type of ["date", "time", "color", "range"]) {
+ yield test_contextmenu("#input1",
+ ["context-navigation", null,
+ ["context-back", false,
+ "context-forward", false,
+ "context-reload", true,
+ "context-bookmarkpage", true], null,
+ "---", null,
+ "context-savepage", true,
+ "---", null,
+ "context-viewbgimage", false,
+ "context-selectall", null,
+ "---", null,
+ "context-viewsource", true,
+ "context-viewinfo", true],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, type, function*(type) {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = type;
+ input.clientTop; // force layout flush
+ });
+ }
+ }
+ );
}
-
-}
-
-
-var gTestNum = 1;
-var subwindow, chromeWin, contextMenu;
-var input, inputspellwrong, inputspellcorrect;
+});
-function startTest() {
- chromeWin = SpecialPowers.wrap(subwindow)
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindow)
- .QueryInterface(Ci.nsIDOMChromeWindow);
- contextMenu = chromeWin.document.getElementById("contentAreaContextMenu");
- ok(contextMenu, "Got context menu XUL");
-
- if (chromeWin.document.getElementById("Browser:Stop").getAttribute("disabled") != "true") {
- SimpleTest.executeSoon(startTest);
- return;
+add_task(function* test_search_input() {
+ todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
+ " it should be disabled");
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", null,
+ "---", null,
+ "spell-check-enabled", true],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = "search";
+ input.clientTop; // force layout flush
+ });
+ }
}
-
- var inputs = subwindow.document.getElementsByTagName('input');
- input = inputs[0];
- inputspellwrong = inputs[1];
- inputspellcorrect = inputs[2];
-
- contextMenu.addEventListener("popupshown", function() { runTest(++gTestNum); }, false);
- runTest(1);
-}
+ );
+});
-// We open this in a separate window, because the Mochitests run inside a frame.
-// The frame causes an extra menu item, and prevents running the test
-// standalone (ie, clicking the test name in the Mochitest window) to see
-// success/failure messages.
-var painted = false, loaded = false;
+add_task(function* test_datetime_month_week_datetimelocal_input_todos() {
+ for (let type of ["datetime", "month", "week", "datetime-local"]) {
+ let returnedType = yield ContentTask.spawn(gBrowser.selectedBrowser, type, function*(type) {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = type;
+ input.clientTop; // force layout flush
+ return input.type;
+ });
+ todo_is(returnedType, type, `TODO: add test for ${type} input fields`);
+ }
+});
-function waitForEvents(event)
-{
- if (event.type == "MozAfterPaint")
- painted = true;
- else if (event.type == "load")
- loaded = true;
- if (painted && loaded) {
- subwindow.removeEventListener("MozAfterPaint", waitForEvents, false);
- subwindow.onload = null;
- SimpleTest.waitForFocus(startTest, subwindow);
- }
-}
+add_task(function* test_text_input_readonly() {
+ todo(false, "context-selectall is enabled on osx-e10s, and windows when" +
+ " it should be disabled");
+ todo(false, "spell-check should not be enabled for input[readonly]. see bug 1246296");
+ yield test_contextmenu("#input1",
+ ["context-undo", false,
+ "---", null,
+ "context-cut", true,
+ "context-copy", true,
+ "context-paste", null, // ignore clipboard state
+ "context-delete", false,
+ "---", null,
+ "context-selectall", null,
+ "---", null,
+ "spell-check-enabled", true],
+ {
+ skipFocusChange: true,
+ *preCheckContextMenuFn() {
+ yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+ let doc = content.document;
+ let input = doc.getElementById("input1");
+ input.type = "text";
+ input.readonly = true;
+ input.clientTop; // force layout flush
+ });
+ }
+ }
+ );
+});
-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");
-subwindow.addEventListener("MozAfterPaint", waitForEvents, false);
-subwindow.onload = waitForEvents;
-
-SimpleTest.waitForExplicitFinish();
-</script>
-</pre>
-</body>
-</html>
+add_task(function* test_cleanup() {
+ yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});