Bug 1358025 - Part 5. Add undo transaction test on input element. r?masayuki draft
authorMakoto Kato <m_kato@ga2.so-net.ne.jp>
Thu, 25 May 2017 14:19:39 +0900
changeset 584850 69167bafbcafd65f0cf8c8da92141f69ebfad13b
parent 584339 8064d6b4577293109c426faa1f4f3e7d72f6e61e
child 630534 cb9417154fb605e4e4de3f13c288331a03685fe7
push id60903
push userm_kato@ga2.so-net.ne.jp
push dateFri, 26 May 2017 03:30:25 +0000
reviewersmasayuki
bugs1358025
milestone55.0a1
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
editor/libeditor/tests/mochitest.ini
editor/libeditor/tests/test_bug1358025.html
--- 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>