Selection.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. module("core.Selection");
  2. /*
  3. * 因为编辑器是必定会放在一个iframe中,所以在测试的过程中我们也放在iframe中测试,以防一些他们没有做容错处理导致的问题出现
  4. * */
  5. //test( 'getRange--简单', function() {
  6. // stop();
  7. // /*防止frame没有加载好导致无法取到document*/
  8. // setTimeout( function() {
  9. // var doc = te.dom[1].contentWindow.document;
  10. // var range = new baidu.editor.dom.Range( doc );
  11. // var div = doc.createElement( 'div' );
  12. // doc.body.appendChild( div );
  13. // div.innerHTML = '<strong>first</strong>second';
  14. // /*必须调用select函数,否则这个选择不会映射到浏览器上,导致selection得到的rangeCount为0
  15. // * select后会把文本节点切开
  16. // * */
  17. // range.setStart( div.firstChild, 0 ).setEnd( div.lastChild, 1 ).select();
  18. // var selection = new baidu.editor.dom.Selection( doc );
  19. // var nativeRange = selection.getRange();
  20. // var sc = nativeRange.startContainer;
  21. // var so = nativeRange.startOffset;
  22. // var ec = nativeRange.endContainer;
  23. // var eo = nativeRange.endOffset;
  24. // /*sc和ec的位置有多个,只能无奈地穷举*/
  25. // // ok( (sc === div) && so == 0 , 'check startContainer/offset' ); (ec === div) && eo == 2 ||好像这种情况在浏览器中不会遇到
  26. // ok( (sc === div.firstChild.firstChild) && so == 0 || (sc === div) && so == 0 || (sc === div.firstChild) && so == 0, 'check startContainer/offset' );
  27. // ok( (ec === div.firstChild.nextSibling) && eo == 1 || (ec === div.lastChild) && eo == 0, 'check endContainer/offset' );
  28. // equal( nativeRange.collapsed, false, 'check collapse status' );
  29. // start();
  30. // }, 20 );
  31. //} );
  32. //
  33. //test( 'getText', function() {
  34. // stop();
  35. // setTimeout( function() {
  36. // var doc = te.dom[1].contentWindow.document;
  37. // var range = new baidu.editor.dom.Range( doc );
  38. // var div = doc.createElement( 'div' );
  39. // doc.body.appendChild( div );
  40. // div.innerHTML = '<em></em><span>spanText</span><strong>first</strong>second';
  41. //
  42. // range.setStart( div.firstChild, 0 ).setEnd( div.lastChild, 1 ).select();
  43. // var selection = new baidu.editor.dom.Selection( doc );
  44. //
  45. // var text = selection.getText();
  46. // equal( text, 'spanTextfirsts', 'check getText function' );
  47. // start();
  48. // }, 20 );
  49. //} );
  50. //
  51. //
  52. //test( 'getstart--文本', function() {
  53. // stop();
  54. // setTimeout( function() {
  55. // var doc = te.dom[1].contentWindow.document;
  56. // var range = new baidu.editor.dom.Range( doc );
  57. // var div = doc.createElement( 'div' );
  58. // doc.body.appendChild( div );
  59. // div.innerHTML = '<em>em<strong><span>spanText</span></strong></em><strong>first</strong>second';
  60. //
  61. // range.setStart( div.firstChild.lastChild.lastChild.firstChild, 0 ).setEnd( div.lastChild, 1 ).select();
  62. // var selection = new baidu.editor.dom.Selection( doc );
  63. // var startNode = selection.getStart();
  64. // /*textNode*/
  65. // ok( startNode === div.firstChild.lastChild.lastChild, 'check startNode' );
  66. // start();
  67. // }, 20 );
  68. //} );
  69. //
  70. //test( 'getstart--边界情况', function() {
  71. // stop();
  72. // setTimeout( function() {
  73. // var doc = te.dom[1].contentWindow.document;
  74. // var range = new baidu.editor.dom.Range( doc );
  75. // var div = doc.createElement( 'div' );
  76. // doc.body.appendChild( div );
  77. // div.innerHTML = '<em>em<strong><span>spanText</span></strong></em><strong>first</strong>second';
  78. //
  79. // range.setStart( div.firstChild.lastChild, 0 ).collapse().select();
  80. // var selection = new baidu.editor.dom.Selection( doc );
  81. // var startNode = selection.getStart();
  82. // /*边界情况,ie下好像会尽量贴文本,因此startNode为em*/
  83. // ok( startNode === div.firstChild.lastChild || startNode === div.firstChild, 'check startNode' );
  84. // start();
  85. // }, 20 );
  86. //} );
  87. test('getRange--闭合选区的边界情况', function () {
  88. var div_new = document.createElement('div');
  89. document.body.appendChild(div_new);
  90. var editor = new baidu.editor.Editor({'autoFloatEnabled': false});
  91. stop();
  92. setTimeout(function () {
  93. editor.render(div_new);
  94. editor.ready(function () {
  95. setTimeout(function () {
  96. var range = new baidu.editor.dom.Range(editor.document);
  97. editor.setContent('<p><strong>xxx</strong></p>');
  98. range.setStart(editor.body.firstChild.firstChild, 0).collapse(true).select();
  99. range = editor.selection.getRange();
  100. var strong = editor.body.firstChild.firstChild;
  101. /*startContainer:ie is xxx,others are strong.firstChild*/
  102. if(ua.browser.ie>8){
  103. ok(( range.startContainer === strong) && range.startOffset === 1, 'startContainer是xxx左边的占位符或者xxx');
  104. }
  105. else{
  106. ok(range.startContainer.nodeType == 3, 'startContainer是文本节点');
  107. ok(( range.startContainer === strong.firstChild) && strong.firstChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.lastChild), 'startContainer是xxx左边的占位符或者xxx');
  108. }
  109. ua.manualDeleteFillData(editor.body);
  110. range.setStart(editor.body.firstChild.firstChild, 1).collapse(true).select();
  111. /*去掉占位符*/
  112. range = editor.selection.getRange();
  113. /*可能为(strong,1)或者(xxx,3)*/
  114. ok(( range.startContainer === strong) || ( range.startContainer === strong.lastChild) && strong.lastChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.firstChild), 'startContainer是xxx或者xxx右边的占位符');
  115. // ok( range.startContainer.nodeType == 1 ? range.startContainer.tagName.toLowerCase() == 'strong' && range.startOffset == 1 : range.startContainer.data == 'xxx' && range.startOffset == 3, 'strong,1或xxx,3' );
  116. ua.manualDeleteFillData(editor.body);
  117. /*p,0*/
  118. range.setStart(editor.body.firstChild, 0).collapse(true).select();
  119. range = editor.selection.getRange();
  120. /*startContainer:ie is xxx,ff is p, chrome is strong*/
  121. // ok( ( range.startContainer === strong.parentNode.firstChild)&& strong.parentNode.firstChild.length == 1 || (range.startContainer.nodeValue.length == 3 && range.startContainer === strong.firstChild.nextSibling), 'startContainer是第一个占位符或者xxx' );
  122. // ua.manualDeleteFillData( editor.body );
  123. // range.setStart( editor.body.firstChild, 1 ).collapse( true ).select();
  124. // equal( range.startContainer.tagName.toLowerCase(), 'p', 'p,1' );
  125. te.dom.push(div_new);
  126. te.obj.push(editor);
  127. start();
  128. }, 50);
  129. });
  130. }, 50);
  131. });
  132. //test( '不闭合选区的边界情况', function () {
  133. //
  134. //} );
  135. //
  136. test('trace 1742 isFocus', function () {
  137. if (!ua.browser.opera) {
  138. var div1 = document.createElement('div');
  139. var div2 = document.createElement('div');
  140. document.body.appendChild(div1);
  141. document.body.appendChild(div2);
  142. var editor1 = new UE.Editor({'initialContent': '<span>hello</span>', 'autoFloatEnabled': false});
  143. var editor2 = new UE.Editor({'initialContent': '<span>hello</span>', 'autoFloatEnabled': false});
  144. editor1.render(div1);
  145. stop();
  146. editor1.ready(function () {
  147. editor2.render(div2);
  148. editor2.ready(function () {
  149. editor1.focus();
  150. ok(editor1.selection.isFocus(), '设editor内容是<span> editor1 is focused');
  151. ok(!editor2.selection.isFocus(), '设editor内容是<span> editor2 is not focused');
  152. editor2.focus();
  153. ok(editor2.selection.isFocus(), '设editor内容是<span> editor2 is focused');
  154. ok(!editor1.selection.isFocus(), '设editor内容是<span> editor1 is not focused');
  155. div1.parentNode.removeChild(div1);
  156. div2.parentNode.removeChild(div2);
  157. var div3 = document.createElement('div');
  158. var div4 = document.createElement('div');
  159. document.body.appendChild(div3);
  160. document.body.appendChild(div4);
  161. var editor3 = new UE.Editor({'initialContent': '<h1>hello</h1>', 'autoFloatEnabled': false});
  162. var editor4 = new UE.Editor({'initialContent': '<h1>hello</h1>', 'autoFloatEnabled': false});
  163. editor3.render(div3);
  164. editor3.ready(function () {
  165. editor4.render(div4);
  166. editor4.ready(function () {
  167. editor3.focus();
  168. ok(editor3.selection.isFocus(), '设editor内容是<h1> editor1 is focused');
  169. ok(!editor4.selection.isFocus(), '设editor内容是<h1> editor2 is not focused');
  170. editor4.focus();
  171. ok(editor4.selection.isFocus(), '设editor内容是<h1> editor2 is focused');
  172. ok(!editor3.selection.isFocus(), '设editor内容是<h1> editor1 is not focused');
  173. setTimeout(function () {
  174. div3.parentNode.removeChild(div3);
  175. div4.parentNode.removeChild(div4);
  176. start();
  177. }, 50);
  178. });
  179. });
  180. });
  181. });
  182. }
  183. });