Bug 1482016 - part 0: Add automated tests for nsIHTMLEditor.selectElement() r=m_kato
authorMasayuki Nakano <masayuki@d-toybox.com>
Tue, 14 Aug 2018 05:56:24 +0000
changeset 486456 302ce3cdb98fd24ebcf184fdba5eefe109b32e5b
parent 486455 5db1348b915fa90b9b8b33f33a4867d1b7e0148f
child 486457 ec2b796f1af29470e3a96873df7fb8dcf805edb3
push id9719
push userffxbld-merge
push dateFri, 24 Aug 2018 17:49:46 +0000
treeherdermozilla-beta@719ec98fba77 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersm_kato
bugs1482016
milestone63.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1482016 - part 0: Add automated tests for nsIHTMLEditor.selectElement() r=m_kato Differential Revision: https://phabricator.services.mozilla.com/D3186
editor/libeditor/tests/mochitest.ini
editor/libeditor/tests/test_nsIHTMLEditor_selectElement.html
--- a/editor/libeditor/tests/mochitest.ini
+++ b/editor/libeditor/tests/mochitest.ini
@@ -276,16 +276,17 @@ subsuite = clipboard
 skip-if = android_version == '24'
 [test_inline_style_cache.html]
 [test_inlineTableEditing.html]
 [test_insertParagraph_in_inline_editing_host.html]
 [test_keypress_untrusted_event.html]
 [test_middle_click_paste.html]
 subsuite = clipboard
 skip-if = android_version == '24'
+[test_nsIHTMLEditor_selectElement.html]
 [test_objectResizing.html]
 [test_root_element_replacement.html]
 [test_select_all_without_body.html]
 [test_spellcheck_pref.html]
 skip-if = toolkit == 'android'
 [test_undo_after_spellchecker_replaces_word.html]
 skip-if = toolkit == 'android'
 [test_undo_redo_stack_after_setting_value.html]
new file mode 100644
--- /dev/null
+++ b/editor/libeditor/tests/test_nsIHTMLEditor_selectElement.html
@@ -0,0 +1,131 @@
+<!DOCTYPE>
+<html>
+<head>
+  <title>Test for nsIHTMLEditor.selectElement()</title>
+  <script src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" href="/tests/SimpleTest/test.css">
+</head>
+<body>
+<div id="display">
+</div>
+<div id="content" contenteditable></div>
+<pre id="test">
+</pre>
+
+<script class="testbody" type="application/javascript">
+
+SimpleTest.waitForExplicitFinish();
+SimpleTest.waitForFocus(function() {
+  let editor = document.getElementById("content");
+  let selection = window.getSelection();
+
+  editor.innerHTML = "<p>p1<b>b1</b><i>i1</i></p><p><b>b2</b><i>i2</i>p2</p>";
+
+  editor.focus();
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.firstChild);
+    ok(false, "nsIHTMLEditor.selectElement() should throw an exception if given node is not an element");
+  } catch (e) {
+    ok(true, `nsIHTMLEditor.selectElement() should throw an exception if given node is not an element: ${e}`);
+  }
+
+  editor.focus();
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.firstChild.nextSibling);
+    is(selection.anchorNode, editor.firstChild,
+       "nsIHTMLEditor.selectElement() should set anchor node to parent of <b> element in the first paragraph");
+    is(selection.anchorOffset, 1,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <b> element in the first paragraph");
+    is(selection.focusNode, editor.firstChild,
+       "nsIHTMLEditor.selectElement() should set focus node to parent of <b> element in the first paragraph");
+    is(selection.focusOffset, 2,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <b> element + 1 in the first paragraph");
+  } catch (e) {
+    ok(false, `nsIHTMLEditor.selectElement() shouldn't throw exception when selecting an element in focused editor #1: ${e}`);
+  }
+
+  editor.focus();
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.nextSibling.firstChild);
+    is(selection.anchorNode, editor.firstChild.nextSibling,
+       "nsIHTMLEditor.selectElement() should set anchor node to parent of <b> element in the second paragraph");
+    is(selection.anchorOffset, 0,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <b> element in the second paragraph");
+    is(selection.focusNode, editor.firstChild.nextSibling,
+       "nsIHTMLEditor.selectElement() should set focus node to parent of <b> element in the second paragraph");
+    is(selection.focusOffset, 1,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <b> element + 1 in the second paragraph");
+  } catch (e) {
+    ok(false, `nsIHTMLEditor.selectElement() shouldn't throw exception when selecting an element in focused editor #2: ${e}`);
+  }
+
+  editor.focus();
+  try {
+    getHTMLEditor().selectElement(editor);
+    ok(false, "nsIHTMLEditor.selectElement() should throw an exception if given node is the editing host");
+  } catch (e) {
+    ok(true, `nsIHTMLEditor.selectElement() should throw an exception if given node is the editing host: ${e}`);
+  }
+
+  editor.focus();
+  try {
+    getHTMLEditor().selectElement(editor.parentElement);
+    ok(false, "nsIHTMLEditor.selectElement() should throw an exception if given node is outside of the editing host");
+  } catch (e) {
+    ok(true, `nsIHTMLEditor.selectElement() should throw an exception if given node is outside of the editing host: ${e}`);
+  }
+
+  selection.removeAllRanges();
+  editor.blur();
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.nextSibling.firstChild);
+    ok(false, "nsIHTMLEditor.selectElement() should throw an exception if there is no active editing host");
+  } catch (e) {
+    ok(true, `nsIHTMLEditor.selectElement() should throw an exception if there is no active editing host: ${e}`);
+  }
+
+  editor.focus();
+  editor.firstChild.firstChild.nextSibling.nextSibling.setAttribute("contenteditable", "false");
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.firstChild.nextSibling.nextSibling);
+    is(selection.anchorNode, editor.firstChild,
+       "nsIHTMLEditor.selectElement() should set anchor node to parent of <i contenteditable=\"false\"> element in the first paragraph");
+    is(selection.anchorOffset, 2,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <i contenteditable=\"false\"> element in the first paragraph");
+    is(selection.focusNode, editor.firstChild,
+       "nsIHTMLEditor.selectElement() should set focus node to parent of <i contenteditable=\"false\"> element in the first paragraph");
+    is(selection.focusOffset, 3,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <i contenteditable=\"false\"> element + 1 in the first paragraph");
+  } catch (e) {
+    ok(false, `nsIHTMLEditor.selectElement() shouldn't throw exception when selecting an element in focused editor #3: ${e}`);
+  }
+
+  editor.focus();
+  editor.firstChild.nextSibling.setAttribute("contenteditable", "false");
+  try {
+    getHTMLEditor().selectElement(editor.firstChild.nextSibling.firstChild.nextSibling);
+    is(selection.anchorNode, editor.firstChild.nextSibling,
+       "nsIHTMLEditor.selectElement() should set anchor node to parent of <i> element in the second paragraph which is not editable");
+    is(selection.anchorOffset, 1,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <i> element in the second paragraph which is not editable");
+    is(selection.focusNode, editor.firstChild.nextSibling,
+       "nsIHTMLEditor.selectElement() should set focus node to parent of <i> element in the second paragraph which is not editable");
+    is(selection.focusOffset, 2,
+       "nsIHTMLEditor.selectElement() should set anchor offset to the index of <i> element + 1 in the second paragraph which is not editable");
+  } catch (e) {
+    ok(false, `nsIHTMLEditor.selectElement() shouldn't throw exception when selecting an element in focused editor #4: ${e}`);
+  }
+
+  SimpleTest.finish();
+});
+
+function getHTMLEditor() {
+  var Ci = SpecialPowers.Ci;
+  var editingSession = SpecialPowers.wrap(window).docShell.editingSession;
+  return editingSession.getEditorForWindow(window).QueryInterface(Ci.nsIHTMLEditor);
+}
+
+</script>
+</body>
+
+</html>