Bug 1358025 - Part 5. Add undo transaction test on input element. r?masayuki
When setting same value (including empty to empty), some browsers might not turn off undo. If settings non-empty value, all browsers doesn't turn off undo. Also, if empty value, Edge and Chrome doesn't turn off undo.
MozReview-Commit-ID: 1nVYEzBr5KJ
--- a/editor/libeditor/tests/mochitest.ini
+++ b/editor/libeditor/tests/mochitest.ini
@@ -229,16 +229,17 @@ skip-if = toolkit == 'android' # bug 131
[test_bug1315065.html]
[test_bug1316302.html]
[test_bug1318312.html]
[test_bug1328023.html]
[test_bug1330796.html]
[test_bug1332876.html]
[test_bug1352799.html]
[test_bug1355792.html]
+[test_bug1358025.html]
[test_CF_HTML_clipboard.html]
subsuite = clipboard
[test_composition_event_created_in_chrome.html]
[test_contenteditable_focus.html]
[test_documentCharacterSet.html]
[test_dom_input_event_on_htmleditor.html]
skip-if = toolkit == 'android' # bug 1054087
new file mode 100644
--- /dev/null
+++ b/editor/libeditor/tests/test_bug1358025.html
@@ -0,0 +1,99 @@
+<html>
+<head>
+ <title>Test for bug 1358025</title>
+ <script type="text/javascript"
+ src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css"
+ href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1358025">Mozilla Bug 1358025</a>
+<div id="display">
+ <input type="text" id="edit">
+</div>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script class="testbody" type="application/javascript">
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(() => {
+ let input = document.getElementById("edit");
+ input.focus();
+
+ let controller =
+ SpecialPowers.wrap(input).controllers.getControllerForCommand("cmd_undo");
+
+ // Create undo transaction
+ SpecialPowers.wrap(input).setUserInput("XXX");
+ SpecialPowers.wrap(input).setUserInput("");
+
+ // Enable undo because this is user input
+ SpecialPowers.wrap(input).setUserInput("");
+ is(input.value, "", "value is empty");
+ ok(controller.isCommandEnabled('cmd_undo'),
+ "Undo is enabled by same empty string");
+
+ SpecialPowers.wrap(input).setUserInput("ABC");
+ is(input.value, "ABC", "value is ABC");
+ ok(controller.isCommandEnabled('cmd_undo'), "Undo is enabled by a string");
+
+ SpecialPowers.wrap(input).setUserInput("ABC");
+ is(input.value, "ABC", "value is ABC");
+ ok(controller.isCommandEnabled('cmd_undo'), "Undo is enabled by same string");
+
+ SpecialPowers.wrap(input).setUserInput("DEF");
+ is(input.value, "DEF", "value is DEF");
+ ok(controller.isCommandEnabled('cmd_undo'),
+ "Undo is enabled by different string");
+
+ SpecialPowers.wrap(input).setUserInput("");
+ is(input.value, "", "value is empty");
+ ok(controller.isCommandEnabled('cmd_undo'),
+ "Undo is enabled by empty string");
+
+ // disable undo because this is by script
+
+ // But Edge and Chrome still turn on undo when setting empty value from
+ // empty value. So we are same behaviour for this case.
+ input.value = "";
+ is (input.value, "", "value is empty");
+ ok(controller.isCommandEnabled('cmd_undo'),
+ "Undo is still enabled by same empty string");
+
+ input.value = "ABC";
+ is(input.value, "ABC", "value is ABC");
+ ok(!controller.isCommandEnabled('cmd_undo'), "Undo is disabled by a string");
+
+ // When setting same value by script, all browsers (Edge, Safari and Chrome)
+ // keep undo state.
+ input.value = "";
+ SpecialPowers.wrap(input).setUserInput("ABC");
+ ok(controller.isCommandEnabled('cmd_undo'), "Undo is enabled");
+ input.value = "ABC";
+ is(input.value, "ABC", "value is ABC");
+ ok(controller.isCommandEnabled('cmd_undo'),
+ "Undo is still enabled by same string");
+
+ input.value = "";
+ SpecialPowers.wrap(input).setUserInput("ABC");
+ ok(controller.isCommandEnabled('cmd_undo'), "Undo is enabled");
+ input.value = "DEF";
+ is(input.value, "DEF", "value is DEF");
+ ok(!controller.isCommandEnabled('cmd_undo'),
+ "Undo is disabled by different string");
+
+ input.value = "";
+ SpecialPowers.wrap(input).setUserInput("DEF");
+ ok(controller.isCommandEnabled('cmd_undo'), "Undo is enabled");
+ input.value = "";
+ is(input.value, "", "value is empty");
+ ok(!controller.isCommandEnabled('cmd_undo'),
+ "Undo is disabled by empty string");
+
+ SimpleTest.finish();
+}, window);
+</script>
+</pre>
+</body>
+</html>