domUtils.js 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718
  1. module( 'core.domUtils' );
  2. test( 'isBoundaryNode--node是firstChild',function(){
  3. if(ua.browser.ie){
  4. // var body = te.dom[1].contentDocument.appendChild(document.createElement('body'));
  5. // var div = body.appendChild(document.createElement('div'));
  6. var div = te.dom[2];
  7. }else{
  8. var div = te.dom[1].contentWindow.document.firstChild.lastChild.appendChild(document.createElement('div'));
  9. }
  10. div.innerHTML = "<span>sss</span>aaa<p>ppp</p>";
  11. var node = div.firstChild.nextSibling;
  12. equal( domUtils.isBoundaryNode(node, "firstChild"), 0 );
  13. equal( domUtils.isBoundaryNode(node, "lastChild"), 0 );
  14. node = div.firstChild.firstChild;
  15. if(ua.browser.ie){
  16. equal( domUtils.isBoundaryNode(node, "firstChild"), 0 );
  17. }else{
  18. equal( domUtils.isBoundaryNode(node, "firstChild"), 1 );
  19. }
  20. equal( domUtils.isBoundaryNode(node, "lastChild"), 0 );
  21. node = div.firstChild.nextSibling.nextSibling;
  22. equal( domUtils.isBoundaryNode(node, "firstChild"), 0 );
  23. equal( domUtils.isBoundaryNode(node, "lastChild"), 1 );
  24. } );
  25. test( 'getPosition--A和B是同一个节点', function() {
  26. var div = te.dom[2];
  27. div.innerHTML = "<span>span</span><img /><b>bbb</b>xxx";
  28. var span_text = div.firstChild.firstChild;
  29. var domUtils = te.obj[3];
  30. equal( domUtils.getPosition( span_text, span_text ), 0, 'identical node' );
  31. } );
  32. test( 'getPosition--A和B是兄弟节点', function() {
  33. var div = te.dom[2];
  34. div.innerHTML = "<span>span</span><img /><b>bbb</b>xxx";
  35. var span_text = div.firstChild.firstChild;
  36. var div_text = div.lastChild;
  37. var domUtils = te.obj[3];
  38. /*span_text在div_text前面*/
  39. equal( domUtils.getPosition( span_text, div_text ), domUtils.POSITION_PRECEDING, 'preceding node' );
  40. /*div_text在span_text后面*/
  41. equal( domUtils.getPosition( div_text, span_text ), domUtils.POSITION_FOLLOWING, 'following node' );
  42. } );
  43. test( 'getPosition--A是B的祖先', function() {
  44. var div = te.dom[2];
  45. div.innerHTML = "<span>span</span><img /><b>bbb</b>xxx";
  46. var span_text = div.firstChild.firstChild;
  47. var domUtils = te.obj[3];
  48. /*A是B的祖先*/
  49. equal( domUtils.getPosition( div, span_text ), domUtils.POSITION_CONTAINS + domUtils.POSITION_PRECEDING, 'preceding node' );
  50. /*A是B的子孙*/
  51. equal( domUtils.getPosition( span_text, div ), domUtils.POSITION_IS_CONTAINED + domUtils.POSITION_FOLLOWING, 'following node' );
  52. } );
  53. test( 'getPosition--A和B在不同dom树上', function() {
  54. stop();
  55. expect( 1 );
  56. var div = te.dom[2];
  57. div.innerHTML = "<span>span</span><img /><b>bbb</b>xxx";
  58. var iframe = te.dom[1];
  59. setTimeout( function() {
  60. var frame_doc = iframe.contentWindow.document || iframe.contentDocument;
  61. var frame_div = frame_doc.createElement( 'div' );
  62. frame_doc.body.appendChild( frame_div );
  63. var domUtils = te.obj[3];
  64. /*A和B在不同dom树上*/
  65. equal( domUtils.getPosition( div, frame_div ) & 1, 1, 'A和B不在同一个dom树上' );
  66. start();
  67. }, 50 );
  68. } );
  69. test( 'getNodeIndex', function() {
  70. var div = te.dom[2];
  71. var domUtils = te.obj[3];
  72. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span></span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  73. var comment = div.firstChild.nextSibling.nextSibling;
  74. equal( domUtils.getNodeIndex( comment ), 2, 'check commnet index' );
  75. var td_text = document.getElementById( 'table' ).firstChild.firstChild.firstChild;
  76. equal( domUtils.getNodeIndex( td_text ), 0, 'check textNode index' );
  77. equal( domUtils.getNodeIndex( div.firstChild ), 0, 'check strong label index' );
  78. equal( domUtils.getNodeIndex( (document.getElementById( 'p' )) ), 5, 'check p label index' );
  79. } );
  80. test( 'findParent--body', function() {
  81. var domUtils = te.obj[3];
  82. equal( domUtils.findParent( document.body ), null, 'find parent for body' );
  83. } );
  84. /*找符合条件的上一个节点,如果条件为空则找父节点*/
  85. test( 'findParent--tester为空', function() {
  86. var domUtils = te.obj[3];
  87. var div = te.dom[2];
  88. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  89. var span_text = document.getElementById( 'span' ).firstChild;
  90. same( domUtils.findParent( span_text ), span_text.parentNode, 'find parent' );
  91. } );
  92. test( 'findParent--tester不为空', function() {
  93. var domUtils = te.obj[3];
  94. var div = te.dom[2];
  95. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  96. var span_text = document.getElementById( 'span' ).firstChild;
  97. var div1 = domUtils.findParent( span_text, function( node ) {
  98. if ( node.id == "test" )
  99. return true;
  100. return false;
  101. } );
  102. same( div1, div, 'find parent' );
  103. } );
  104. /*不考虑includeSelf的时候取body的parent的情况*/
  105. test( 'findParentByTagName--body', function() {
  106. var domUtils = te.obj[3];
  107. var div = te.dom[2];
  108. same( domUtils.findParentByTagName( document.body, 'body' ), null, 'parent is self' );
  109. } );
  110. test( 'findParentByTagName--tagName为字符串', function() {
  111. var domUtils = te.obj[3];
  112. var div = te.dom[2];
  113. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  114. var br = document.getElementById( 'p' ).firstChild;
  115. same( domUtils.findParentByTagName( br, 'div' ), div, 'tagName为字符串' );
  116. same( domUtils.findParentByTagName( br, 'em' ), null, 'tagName为字符串返回null' );
  117. } );
  118. test( 'findParentByTagName--tagName为字符串数组', function() {
  119. var domUtils = te.obj[3];
  120. var div = te.dom[2];
  121. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  122. var br = document.getElementById( 'p' ).firstChild;
  123. var tagName = ['em','p','div'];
  124. same( domUtils.findParentByTagName( br, tagName ), document.getElementById( 'p' ), 'tagName为字符串数组,找出第一个符合条件的父节点' );
  125. } );
  126. test( 'findParentByTagName--文本节点', function() {
  127. var domUtils = te.obj[3];
  128. var div = te.dom[2];
  129. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  130. var span_text = document.getElementById( 'span' ).firstChild;
  131. var tagName = ['em','p','div'];
  132. same( domUtils.findParentByTagName( span_text, tagName ), div, '文本节点' );
  133. } );
  134. test( 'findParents', function() {
  135. var domUtils = te.obj[3];
  136. var div = te.dom[2];
  137. div.innerHTML = '<strong>ddddd</strong><!----><!--hhhhh--><span id="span">span</span><b>xxxxx</b><p id="p"><br /><img /><table id="table"><tr><td>dddd</td></tr></table></p>';
  138. var span_text = document.getElementById( 'span' ).firstChild;
  139. /*includeSelf*/
  140. var parents = domUtils.findParents( span_text, true );
  141. equal( parents.length, 4, 'check parent count' );
  142. same( parents[0], document.body, 'first parent is body' );
  143. same( parents[1], div, 'second parent is div' );
  144. same( parents[2], span_text.parentNode, 'third parent is span' );
  145. same( parents[3], span_text, 'last parent is self' );
  146. /*不逆序存放祖先节点,closerFirst=false*/
  147. parents = domUtils.findParents( span_text, false, null, true );
  148. equal( parents.length, 3, 'check parent count' );
  149. same( parents[0], span_text.parentNode, 'first parent is span' );
  150. same( parents[1], div, 'second parent is div' );
  151. same( parents[2], document.body, 'last parent is body' );
  152. } );
  153. test( 'findParents--tester', function() {
  154. var domUtils = te.obj[3];
  155. var div = te.dom[2];
  156. div.innerHTML = '<div><p id="p"><br /><img id="img" /><table id="table"><tr><td>dddd</td></tr></table></p></div>';
  157. var img = document.getElementById( 'img' );
  158. var parents = domUtils.findParents( img, false, function( node ) {
  159. if ( node.tagName.toLowerCase() == 'div' || node.tagName.toLowerCase() == 'body' )
  160. return false;
  161. return true;
  162. } );
  163. equal( parents.length, 1, 'check parent count' );
  164. same( parents[0], div.firstChild.firstChild, 'first parent is p' );
  165. } );
  166. test( 'insertAfter', function() {
  167. var domUtils = te.obj[3];
  168. var div = te.dom[2];
  169. var textNode = document.createTextNode( 'text' );
  170. domUtils.insertAfter( div, textNode );
  171. te.dom.push( textNode );
  172. equal( textNode, div.nextSibling, 'insertAfter' );
  173. } );
  174. test( 'remove--not keep children', function() {
  175. var domUtils = te.obj[3];
  176. var div = te.dom[2];
  177. div.innerHTML = "<p>xxx<span><em>xxxx</em>xxxx</span></p><div>xxxx</div>";
  178. var text = div.firstChild.firstChild;
  179. var p = div.firstChild;
  180. /*删除文本节点*/
  181. var node = domUtils.remove( text );
  182. equal( ua.getChildHTML( div ), '<p><span><em>xxxx</em>xxxx</span></p><div>xxxx</div>' );
  183. same( text, node, 'check removed textNode' );
  184. /*删除有孩子的节点*/
  185. node = domUtils.remove( p );
  186. equal( ua.getChildHTML( div ), '<div>xxxx</div>' );
  187. same( node, p, 'check removed p' );
  188. } );
  189. test( 'remove-- keep children', function() {
  190. var domUtils = te.obj[3];
  191. var div = te.dom[2];
  192. div.innerHTML = '<p id="p">xxx<span><em>xxxx</em>xxxx</span><img /></p><div>xxxx</div>';
  193. var text = div.firstChild.firstChild;
  194. var p = div.firstChild;
  195. /*删除文本节点*/
  196. var node = domUtils.remove( text, true );
  197. equal( ua.getChildHTML( div ), '<p id="p"><span><em>xxxx</em>xxxx</span><img></p><div>xxxx</div>' );
  198. same( text, node, 'check removed textNode' );
  199. /*删除有孩子的节点*/
  200. node = domUtils.remove( p, true );
  201. equal( ua.getChildHTML( div ), '<span><em>xxxx</em>xxxx</span><img><div>xxxx</div>' );
  202. same( node.id, p.id, 'check removed p' );
  203. } );
  204. test( 'getNextDomNode--没有filter', function() {
  205. var domUtils = te.obj[3];
  206. var div = te.dom[2];
  207. div.innerHTML = '<p id="p">p_text<span><em>xxxx</em>xxxx</span><img /></p><div>xxxx</div>';
  208. var p = div.firstChild;
  209. /*直接查找兄弟节点*/
  210. same( domUtils.getNextDomNode( p ), div.lastChild, '后兄弟节点' );
  211. // same( domUtils.getPreviousDomNode( divChild ), p, '前一个兄弟节点' );
  212. /*startFromChild=true,查找孩子结点*/
  213. equal( domUtils.getNextDomNode( p, true ).data, 'p_text', 'text node' );
  214. // equal( domUtils.getPreviousDomNode( p, true ), p.lastChild, 'text node' );
  215. } );
  216. test( 'getNextDomNode--有filter', function() {
  217. var domUtils = te.obj[3];
  218. var div = te.dom[2];
  219. div.innerHTML = '<div id="p"><span><em>xxxx</em>xxxx</span><p>xx</p><img /></div><div>xxxx</div>';
  220. document.body.insertBefore( document.createElement( 'span' ), div );
  221. var span = div.firstChild.firstChild;
  222. var filter = function( node ) {
  223. if ( $( node ).css( 'display' ) == 'block' )
  224. return false;
  225. return true;
  226. };
  227. same( domUtils.getNextDomNode( span, false, filter ), div.firstChild.lastChild, '找到第一个不为block元素的兄弟节点' );
  228. // same( domUtils.getPreviousDomNode( div, true, filter ), div.previousSibling, '孩子中没有block元素,则找父亲的previousSibling节点' );
  229. te.obj.push( div.previousSibling );
  230. } );
  231. test( 'getNextDomNode-没有兄弟或孩子', function() {
  232. var domUtils = te.obj[3];
  233. var div = te.dom[2];
  234. div.innerHTML = '<p id="p">p_text<span><em>xxxx</em>xxxx</span><img /></p><div>xxxx</div>';
  235. var p = div.firstChild;
  236. /*直接查找兄弟节点*/
  237. // same( domUtils.getPreviousDomNode( p ), div.previousSibling, '前面木有兄弟' );
  238. same( domUtils.getNextDomNode( div.lastChild ), div.nextSibling, '后面木有兄弟' );
  239. } );
  240. test( 'isBookmarkNode', function() {
  241. var domUtils = te.obj[3];
  242. var div = te.dom[2];
  243. var range = te.obj[2];
  244. div.innerHTML = '<span><em>xxxx</em>xxxx</span><img><div>xxxx</div>';
  245. range.setStart( div, 0 ).setEnd( div, 1 );
  246. range.createBookmark();
  247. ok( domUtils.isBookmarkNode( div.firstChild ), 'is BookmarkNode' );
  248. ok( !domUtils.isBookmarkNode( div.firstChild.nextSibling ), 'not BookmarkNode' );
  249. } );
  250. test( 'getWindow', function() {
  251. var div = te.dom[2];
  252. var domUtils = te.obj[3];
  253. var w = domUtils.getWindow( div );
  254. ok( w === self.window, 'check window' );
  255. } );
  256. test( 'getWindow--iframe', function() {
  257. var f = te.dom[1];
  258. var domUtils = te.obj[3];
  259. expect( 1 );
  260. var frame_doc = f.contentWindow.document || f.contentDocument;
  261. stop();
  262. setTimeout( function() {
  263. var frame_div = frame_doc.createElement( 'div' );
  264. frame_doc.body.appendChild( frame_div );
  265. var w = domUtils.getWindow( frame_div );
  266. ok( f.contentWindow === w, 'same window' );
  267. start();
  268. } );
  269. } );
  270. test( 'getCommonAncestor--body', function() {
  271. var div = te.dom[2];
  272. var domUtils = te.obj[3];
  273. equal( domUtils.getCommonAncestor( div, document.body ).tagName.toLocaleLowerCase(), 'body', '第二个参数是body' );
  274. equal( domUtils.getCommonAncestor( document.body, div ).tagName.toLocaleLowerCase(), 'body', '第一个参数是body' );
  275. } );
  276. test( 'getCommonAncestor--自己', function() {
  277. var div = te.dom[2];
  278. var domUtils = te.obj[3];
  279. same( domUtils.getCommonAncestor( div, div ), div, '自己和自己的公共祖先' );
  280. } );
  281. test( 'getCommonAncestor--兄弟节点', function() {
  282. var div = te.dom[2];
  283. var domUtils = te.obj[3];
  284. div.innerHTML = '<span>xxxx</span><p><table><tr><td id="td">dddd</td></tr></table></p>';
  285. var span_text = div.firstChild.firstChild;
  286. var td = document.getElementById( 'td' );
  287. same( domUtils.getCommonAncestor( span_text, td ), div, '兄弟节点' );
  288. } );
  289. test( 'getCommonAncestor--不在一个dom树', function() {
  290. stop();
  291. expect( 1 );
  292. var div = te.dom[2];
  293. var f = te.dom[1];
  294. setTimeout( function() {
  295. var domUtils = te.obj[3];
  296. var frame_doc = f.contentWindow.document || f.contentDocument;
  297. var frame_div = frame_doc.createElement( 'div' );
  298. frame_doc.body.appendChild( frame_div );
  299. same( domUtils.getCommonAncestor( frame_div, div ), null, '不在一个dom树' );
  300. start();
  301. }, 50 );
  302. } );
  303. test( 'isWhitespace', function() {
  304. var div = te.dom[2];
  305. var domUtils = te.obj[3];
  306. div.innerHTML = "aaa\ufeff\u200B\t\t\n\r";
  307. ok( !domUtils.isWhitespace( div.firstChild ), 'not whiteSpace' );
  308. div.innerHTML = baidu.editor.browser.ie && baidu.editor.browser.version == '6' ? '\ufeff' : '\u200B' + '\t\t\n\r';
  309. ok( domUtils.isWhitespace( div.firstChild ), 'is whiteSpace' );
  310. } );
  311. test( 'isEmptyInlineElement', function() {
  312. var div = te.dom[2];
  313. var domUtils = te.obj[3];
  314. div.innerHTML = '<span><b><i><b>\n\r</b>xxxx</i></b><i></i></span>';
  315. var b1 = div.firstChild.firstChild;
  316. ok( !domUtils.isEmptyInlineElement( b1 ), 'not empty inline' );
  317. ok( domUtils.isEmptyInlineElement( b1.firstChild.firstChild ), 'is emtpy inline element' );
  318. } );
  319. test( 'isEmptyInlineElement-nodeType!=1', function() {
  320. var div = te.dom[2];
  321. var domUtils = te.obj[3];
  322. div.innerHTML = '<span><b>\n\r\ufeff\u200B</b>xxxx<i></i></span>';
  323. ok( !domUtils.isEmptyInlineElement( div.firstChild.firstChild.firstChild ), 'textNode not inline element' );
  324. } );
  325. test( 'isEmptyInlineElement-block element', function() {
  326. var div = te.dom[2];
  327. var domUtils = te.obj[3];
  328. div.innerHTML = '<span><b><i><b>\n\r</b>xxxx</i></b><i></i></span>';
  329. ok( !domUtils.isEmptyInlineElement( div ), 'not inline element' );
  330. } );
  331. test( 'clearEmptySibling', function() {
  332. var div = te.dom[2];
  333. var domUtils = te.obj[3];
  334. div.innerHTML = '<p>xxx<span><u><i><b></b></i></u>xxxxx</span><img /></p><table><tr><td><i></i></td></tr></table>';
  335. var text = div.firstChild.firstChild;
  336. /*没有空sibling*/
  337. domUtils.clearEmptySibling( text );
  338. equal( ua.getChildHTML( div ), '<p>xxx<span><u><i><b></b></i></u>xxxxx</span><img></p><table><tbody><tr><td><i></i></td></tr></tbody></table>', '没有空sibling' );
  339. var span = text.nextSibling;
  340. domUtils.clearEmptySibling( span );
  341. equal( ua.getChildHTML( div ), '<p>xxx<span><u><i><b></b></i></u>xxxxx</span><img></p><table><tbody><tr><td><i></i></td></tr></tbody></table>' );
  342. /*左边有空sibling*/
  343. domUtils.clearEmptySibling( span.lastChild );
  344. equal( ua.getChildHTML( div ), '<p>xxx<span>xxxxx</span><img></p><table><tbody><tr><td><i></i></td></tr></tbody></table>', '左边有空sibling' );
  345. /*左右边有空sibling*/
  346. div.innerHTML = '<p><i></i>\n<b>\t<i><u>\n\t\r</u></i></b>xxxx<b></b></p>';
  347. domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling );
  348. //TODO 有空白文本的时候是否需要删除
  349. equal( div.innerHTML.toLocaleLowerCase(), '<p>xxxx</p>', '左右边有空sibling' );
  350. /*左右多个连续的空inline sibling*/
  351. div.innerHTML = '<span><b></b><i>\t\t</i><div id="div"></div><var></var></span>';
  352. var div_new = document.getElementById( 'div' );
  353. domUtils.clearEmptySibling( div_new );
  354. equal( ua.getChildHTML( div ), '<span><div id="div"></div></span>', '连续空inline sibling' );
  355. /*左右边有空块元素*/
  356. div.innerHTML = '<div><p></p>xxxx<b></b></div>';
  357. domUtils.clearEmptySibling( div.firstChild.firstChild.nextSibling );
  358. equal( ua.getChildHTML( div ), '<div><p></p>xxxx</div>', '左右边有空块元素' );
  359. } );
  360. /*不能误删bookmark*/
  361. test( 'clearEmptySibling--bookmark', function() {
  362. var div = te.dom[2];
  363. var domUtils = te.obj[3];
  364. var r = te.obj[2];
  365. div.innerHTML = '<span><a>link</a></span>';
  366. var a = div.firstChild.firstChild;
  367. var link = a.firstChild;
  368. r.selectNode( link );
  369. r.createBookmark();
  370. /*bookmark节点*/
  371. domUtils.clearEmptySibling( link );
  372. ok( /_baidu_bookmark_end/.test( link.nextSibling.id ), '右边的bookmark sibling没有删掉' );
  373. ok( /_baidu_bookmark_start/.test( link.previousSibling.id ), '左边的bookmark sibling没有删掉' );
  374. } );
  375. test( 'clearEmptySibling--ignoreNext/ignorePrevious', function() {
  376. var div = te.dom[2];
  377. var domUtils = te.obj[3];
  378. /*ignoreNext*/
  379. div.innerHTML = '<p><i></i>\n<b>\t<i><u>\n\t\r</u></i></b>xxxx<b></b></p>';
  380. domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, true );
  381. equal( div.innerHTML.toLocaleLowerCase(), '<p>xxxx<b></b></p>', 'ignore next' );
  382. /*ignorePrevious*/
  383. div.innerHTML = '<p><i></i>\n<b>\t<i><u>\n\t\r</u></i></b>xxxx<b></b></p>';
  384. domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, false, true );
  385. equal( ua.getChildHTML( div ), '<p><i></i><b><i><u></u></i></b>xxxx</p>', 'ignore next' );
  386. /*ignorePrevious&&ignoreNext*/
  387. div.innerHTML = '<p><i></i>\n<b>\t<i><u>\n\t\r</u></i></b>xxxx<b></b></p>';
  388. domUtils.clearEmptySibling( div.firstChild.lastChild.previousSibling, true, true );
  389. equal( ua.getChildHTML( div ), '<p><i></i><b><i><u></u></i></b>xxxx<b></b></p>', 'ignore next&&previous' );
  390. } );
  391. test( 'split--offset正常', function() {
  392. var div = te.dom[2];
  393. var domUtils = te.obj[3];
  394. div.innerHTML = '<span>span</span> >';
  395. var span = div.firstChild;
  396. domUtils.split( span.firstChild, 2 );
  397. equal( span.childNodes.length, 2, 'check child count' );
  398. equal( span.childNodes[0].data, 'sp', 'check firstChild' );
  399. equal( span.childNodes[1].data, 'an', 'check secondChild' );
  400. } );
  401. test( 'split--offset=0', function() {
  402. var div = te.dom[2];
  403. var domUtils = te.obj[3];
  404. div.innerHTML = '<span>span</span> >';
  405. var span = div.firstChild;
  406. domUtils.split( span.firstChild, 0 );
  407. equal( span.childNodes.length, 2, 'check child count' );
  408. equal( span.childNodes[0].data, '', 'check firstChild' );
  409. equal( span.childNodes[1].data, 'span', 'check secondChild' );
  410. } );
  411. test( 'split--offset=data.length', function() {
  412. var div = te.dom[2];
  413. var domUtils = te.obj[3];
  414. div.innerHTML = '<span>span</span> >';
  415. var span = div.firstChild;
  416. domUtils.split( span.firstChild, 4 );
  417. equal( span.childNodes.length, 2, 'check child count' );
  418. equal( span.childNodes[0].data, 'span', 'check firstChild' );
  419. equal( span.childNodes[1].data, '', 'check secondChild' );
  420. } );
  421. /*求相对视窗的位置而不是实际位置*/
  422. //test( 'getXY', function() {
  423. // var div = te.dom[2];
  424. // var domUtils = te.obj[3];
  425. // equal( domUtils.getXY( div )['x'], ua.findPosition( div )[0] - document.documentElement.scrollLeft, 'check X' );
  426. // equal( domUtils.getXY( div )['y'], ua.findPosition( div )[1] - document.documentElement.scrollTop, 'check Y' );
  427. //
  428. //} );
  429. test( 'on--跨iframe加载', function() {
  430. expect( 1 );
  431. var domUtils = te.obj[3];
  432. var op = {
  433. onafterstart : function( f ) {
  434. domUtils.on( f, 'load', function() {
  435. ok( true, 'on load of iframe success' );
  436. } );
  437. },
  438. ontest : function() {
  439. this.finish();
  440. }
  441. };
  442. ua.frameExt( op );
  443. } );
  444. test( 'on- 给不同的dom元素绑定相同的事件', function() {
  445. var domUtils = te.obj[3];
  446. expect( 2 );
  447. var div2 = document.body.appendChild( document.createElement( 'div' ) );
  448. div2.id = 'test2';
  449. te.dom.push( div2 );
  450. var handle = function( e ) {
  451. ok( true, e.type + ' event triggered' );
  452. };
  453. domUtils.on( te.dom[2], 'mouseover', handle);
  454. domUtils.on( te.dom[1], 'mouseover', handle );
  455. ua.mouseover( te.dom[2] );
  456. ua.mouseover( te.dom[1] );
  457. } );
  458. test( 'on-多事件的字符串参数', function() {
  459. var domUtils = te.obj[3];
  460. expect( 2 );
  461. var div2 = document.body.appendChild( document.createElement( 'div' ) );
  462. div2.id = 'test2';
  463. te.dom.push( div2 );
  464. var handle = function( e ) {
  465. ok( true, e.type + ' event triggered' );
  466. };
  467. domUtils.on( te.dom[2], 'mouseover mousedown', handle);
  468. ua.mouseover( te.dom[2] );
  469. ua.mousedown( te.dom[2] );
  470. } );
  471. test( 'un- 给不同的dom元素绑定相同的事件,解除一个,另一个仍然有效', function() {
  472. var domUtils = te.obj[3];
  473. expect( 1 );
  474. var div2 = document.body.appendChild( document.createElement( 'div' ) );
  475. div2.id = 'test2';
  476. te.dom.push( div2 );
  477. var handle = function( e ) {
  478. ok( true, e.type + ' event triggered' );
  479. };
  480. domUtils.on( te.dom[2], 'mouseover', handle);
  481. domUtils.on( te.dom[1], 'mouseover', handle );
  482. domUtils.un( te.dom[2],'mouseover', handle );
  483. ua.mouseover( te.dom[2] );
  484. ua.mouseover( te.dom[1] );
  485. } );
  486. test( 'un-多事件的字符串参数', function() {
  487. var domUtils = te.obj[3];
  488. expect( 0 );
  489. var div2 = document.body.appendChild( document.createElement( 'div' ) );
  490. div2.id = 'test2';
  491. te.dom.push( div2 );
  492. var handle = function( e ) {
  493. ok( false, e.type + ' 没有注销' );
  494. };
  495. domUtils.on( te.dom[2], 'mouseover mousedown', handle);
  496. domUtils.un(te.dom[2],'mouseover mousedown',handle);
  497. ua.mouseover( te.dom[2] );
  498. ua.mousedown( te.dom[2] );
  499. stop();
  500. setTimeout(function(){start()},2000)
  501. } );
  502. /*绑定多个事件*/
  503. test( 'on', function() {
  504. var domUtils = te.obj[3];
  505. expect( 2 );
  506. domUtils.on( te.dom[2], ['mouseover','keypress'], function( e ) {
  507. ok( true, e.type + ' event triggered' );
  508. } );
  509. ua.mouseover( te.dom[2] );
  510. ua.keypress( te.dom[2] );
  511. } );
  512. test( "test case sensitive", function() {
  513. var div = te.dom[2];
  514. var domUtils = te.obj[3];
  515. if ( ua.browser.ie ) {
  516. ok( true, 'IE下不支持诸如DOMNodeInserted等mutation事件' );
  517. return;
  518. }
  519. // ok(false, 'TODO: 添加大小写敏感事件的on绑定和un取消用例,比如DOMMouseScroll');
  520. expect( 2 );
  521. domUtils.on( div, 'DOMNodeInserted', function() {
  522. ok( true, '用DOMNodeInserted测试大小写敏感事件的on绑定' );
  523. domUtils.un( div, 'DOMNodeInserted' );
  524. } );
  525. div.appendChild( document.createElement( 'div' ) );
  526. div.appendChild( document.createElement( 'div' ) );
  527. } );
  528. test( "un--取消注册unload事件", function() {
  529. expect( 1 );
  530. var domUtils = te.obj[3];
  531. var div = te.dom[2];
  532. var handle_a = function() {
  533. ok( true, "check unload" );
  534. };
  535. domUtils.on( div, "click", handle_a );
  536. /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */
  537. ua.click( div );
  538. domUtils.un( div, "click", handle_a );
  539. ua.click( div );
  540. } );
  541. test( "un--同一个回调注册多个事件,后面事件会将第一个事件dhandler覆盖掉", function() {
  542. expect( 1 );
  543. var domUtils = te.obj[3];
  544. var div = te.dom[2];
  545. var handle_a = function() {
  546. ok( true, "应当只会执行一次" );
  547. };
  548. /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */
  549. domUtils.on( div, "click", handle_a );
  550. domUtils.on(div,'dbclick',handle_a);
  551. ua.click( div );
  552. domUtils.un( div, "click", handle_a );
  553. ua.click( div );
  554. } );
  555. test( "un--同一个回调同一个事件注册2次", function() {
  556. expect( 1 );
  557. var domUtils = te.obj[3];
  558. var div = te.dom[2];
  559. var handle_a = function() {
  560. ok( true, "check unload" );
  561. };
  562. /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */
  563. domUtils.on( div, "click", handle_a );
  564. domUtils.on(div,'click',handle_a);
  565. ua.click( div );
  566. domUtils.un( div, "click", handle_a );
  567. ua.click( div );
  568. } );
  569. test( "un--同一个事件取消注册三次", function() {
  570. expect( 1 );
  571. var domUtils = te.obj[3];
  572. var div = te.dom[2];
  573. var handle_a = function() {
  574. ok( true, "check unload" );
  575. };
  576. /* 直接调用ua提供的接口跨浏览器接口,屏蔽浏览器之间的差异 */
  577. domUtils.on( div, "click", handle_a );
  578. ua.click( div );
  579. domUtils.un( div, "click", handle_a );
  580. domUtils.un( div, "click", handle_a );
  581. domUtils.un( div, "click", handle_a );
  582. ua.click( div );
  583. } );
  584. /** * 跨frame on然后un */
  585. test( "window resize", function() {
  586. expect( 1 );
  587. var domUtils = te.obj[3];
  588. ua.frameExt( {
  589. onafterstart : function( f ) {
  590. $( f ).css( 'width', 200 );
  591. },
  592. ontest : function( w, f ) {
  593. var op = this;
  594. var fn = function() {
  595. ok( true );
  596. };
  597. domUtils.on( w, 'resize', fn );
  598. $( f ).css( 'width', 220 );
  599. /* 貌似通过jquery触发窗体变化会存在延时 */
  600. setTimeout( function() {
  601. domUtils.un( w, 'resize', fn );
  602. $( f ).css( 'width', 240 );
  603. setTimeout( op.finish, 100 );
  604. }, 500 );
  605. } } );
  606. } );
  607. test( 'isSameElement--compare with self', function() {
  608. var div = te.dom[2];
  609. var domUtils = te.obj[3];
  610. $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' );
  611. ok( domUtils.isSameElement( div, div ), 'compare with self' );
  612. } );
  613. test( 'isSameElement--tagName不一样', function() {
  614. var div = te.dom[2];
  615. var domUtils = te.obj[3];
  616. div.appendChild( document.createElement( 'span' ) );
  617. $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' );
  618. ok( !domUtils.isSameElement( div, div.firstChild ), 'different tagName' );
  619. } );
  620. //TODO 目前的判断有问题,ie下手动创建的img会自动添加一个complete属性,导致比较结果为false,因此不对img进行比较
  621. test( 'isSameElement--img的src和宽高比较', function() {
  622. var div = te.dom[2];
  623. var domUtils = te.obj[3];
  624. div.innerHTML = '<span src="http://img.baidu.com/hi/jx2/j_0001.gif" width="50" height="51"></span>';
  625. var span = document.createElement( 'span' );
  626. span.setAttribute( 'src', 'http://img.baidu.com/hi/jx2/j_0001.gif' );
  627. span.setAttribute( 'height', '51' );
  628. span.setAttribute( 'width', '50' );
  629. div.appendChild( span );
  630. ok( domUtils.isSameElement( div.firstChild, div.lastChild ), '手动创建的img的src和宽高比较' );
  631. } );
  632. test( 'isSameElement--两种元素的样式通过不同方式设置', function() {
  633. var div = te.dom[2];
  634. var domUtils = te.obj[3];
  635. $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' );
  636. var div_new = document.createElement( 'div' );
  637. document.body.appendChild( div_new );
  638. te.dom.push( div_new );
  639. div_new.innerHTML = '<div id="test" class="div_class" name="div_name" style="border:1px;font-size:12px;background-color:red;width:20px;height:12px;"></div>';
  640. ok( domUtils.isSameElement( div_new.firstChild, div ), 'is sameElement' );
  641. /*防止前后顺序引起的问题*/
  642. ok( domUtils.isSameElement( div, div_new.firstChild ), 'is sameElement' );
  643. } );
  644. test( 'isSameElement--A比B多一个属性', function() {
  645. var div = te.dom[2];
  646. var domUtils = te.obj[3];
  647. div.innerHTML = '<span class="div_class" id="span_id1" name="span_name1"></span>';
  648. var div_new = document.createElement( 'div' );
  649. document.body.appendChild( div_new );
  650. te.dom.push( div_new );
  651. div_new.innerHTML = '<span class="div_class" id="span_id1"></span>';
  652. ok( !domUtils.isSameElement( div_new.firstChild, div ), 'A and B is not sameElement' );
  653. ok( ! domUtils.isSameElement( div, div_new.firstChild ), 'B and A is not sameElement' );
  654. } );
  655. test( 'isSameElement--img的属性比较', function() {
  656. var div = te.dom[2];
  657. var domUtils = te.obj[3];
  658. // var editor = new baidu.editor.Editor();
  659. // editor.render(div);
  660. div.innerHTML = '<img style="width: 200px;height: 200px" src="http://ueditor.baidu.com/img/logo.png">hello';
  661. var div1 = document.createElement( 'div' );
  662. var html = '<img src="http://ueditor.baidu.com/img/logo.png" style="width: 200px;height: 200px" >';
  663. div1.innerHTML = html;
  664. ok( domUtils.isSameElement( div.firstChild, div1.firstChild ), '属性一致' )
  665. } );
  666. /*暂时不会对颜色不同表达方式做转换*/
  667. //test( 'isSameElement--style描述方式不同', function() {
  668. // var div = te.dom[2];
  669. // var domUtils = te.obj[3];
  670. // $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' );
  671. // var div_new = document.createElement( 'div' );
  672. // document.body.appendChild( div_new );
  673. // te.dom.push( div_new );
  674. // div_new.innerHTML = '<div id="test" class="div_class" name="div_name" style="border:1px;font-size:12px;background-color:rgb(255,0,0);width:20px;height:12px;"></div>';
  675. // ok( domUtils.isSameElement( div_new.firstChild, div ), 'A and B are sameElement' );
  676. // div_new.innerHTML = '<div id="test" class="div_class" name="div_name" style="border:1px;font-size:12px;background-color:#ff0000;width:20px;height:12px;"></div>';
  677. // ok( domUtils.isSameElement( div, div_new.firstChild ), 'B and A sameElement' );
  678. //} );
  679. test( 'isSameElement--A比B多一个style属性', function() {
  680. var div = te.dom[2];
  681. var domUtils = te.obj[3];
  682. $( div ).attr( 'name', 'div_name' ).attr( 'class', 'div_class' ).css( 'background-color', 'red' ).css( 'border', '1px' ).css( 'font-size', '12px' ).css( 'height', '12px' ).css( 'width', '20px' );
  683. var div_new = document.createElement( 'div' );
  684. document.body.appendChild( div_new );
  685. te.dom.push( div_new );
  686. div_new.innerHTML = '<div id="test" class="div_class" name="div_name" style="border:1px;font-size:12px;background-color:rgb(255,0,0);width:20px;height:12px;left:12px"></div>';
  687. ok( !domUtils.isSameElement( div_new.firstChild, div ), 'A and B is not sameElement' );
  688. ok( ! domUtils.isSameElement( div, div_new.firstChild ), 'B and A is not sameElement' );
  689. } );
  690. //test( 'isRedundantSpan--非span', function() {
  691. // var div = te.dom[2];
  692. // var domUtils = te.obj[3];
  693. // div.innerHTML = 'text';
  694. // ok( !domUtils.isRedundantSpan( div ), 'not span' );
  695. // ok( !domUtils.isRedundantSpan( div.firstChild ), 'text node is not span' );
  696. //} );
  697. //
  698. //test( 'isRedundentSpan', function() {
  699. // var div = te.dom[2];
  700. // var domUtils = te.obj[3];
  701. // div.innerHTML = '<span></span><span name="span" style="font-size:12px"></span>';
  702. // ok( domUtils.isRedundantSpan( div.firstChild ), 'is redundentSapn' );
  703. // ok( !domUtils.isRedundantSpan( div.lastChild ), 'is not redundentSpan' );
  704. // var span = document.createElement( 'span' );
  705. // div.appendChild( span );
  706. // ok( domUtils.isRedundantSpan( span ), 'is redundent span' );
  707. //} );
  708. /*rd说实际应用情况会按照固定的方式设置样式,因此不考虑兼容rgb(255,0,0),#ff0000,red这三者的差别*/
  709. test( 'isSameStyle', function() {
  710. var div = te.dom[2];
  711. var domUtils = te.obj[3];
  712. /*分号,空格*/
  713. div.innerHTML = '<span style="font-size:12px; background-color:rgb(255,0,0);"></span><span name="span" style="font-size:12px;background-color:rgb(255,0,0) "></span>';
  714. ok( domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have same style' );
  715. } );
  716. test( 'isSameStyle--float', function() {
  717. var div = te.dom[2];
  718. var domUtils = te.obj[3];
  719. /*分号,空格*/
  720. div.innerHTML = '<span style=" float:left;font-size:12px; "></span><span name="span" style="font-size:12px;float:left"></span>';
  721. ok( domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have same style' );
  722. div.firstChild.style.cssText = "float:left;font-size:12px;background-color:red";
  723. ok( ! domUtils.isSameStyle( div.firstChild, div.lastChild ), 'have differtnt style' );
  724. } );
  725. test( 'isBlockElm', function() {
  726. var div = te.dom[2];
  727. var domUtils = te.obj[3];
  728. /*isindex,noframes是特例,在这里不做验证*/
  729. var blockElms = ['address','blockquote','center','dir','div','dl','fieldset','form','h1','h2','h3','h4','h5','h6','hr','menu','ol','p','pre','table','ul'];
  730. var k = blockElms.length;
  731. while ( k ) {
  732. var elm = document.createElement( blockElms[k - 1] );
  733. div.appendChild( elm );
  734. ok( domUtils.isBlockElm( elm ), elm.tagName + ' is block elm' );
  735. k--;
  736. }
  737. blockElms = ['a','abbr','acronym','b','bdo','big','br','cite','code','dfn','em','font','i','img','input','kbd','label','q','s','samp','select','small','span','strike','strong','sub','sp','textarea','tt','u','noscript' ];
  738. k = blockElms.length;
  739. while ( k ) {
  740. var elm = document.createElement( blockElms[k - 1] );
  741. div.appendChild( elm );
  742. ok( !domUtils.isBlockElm( elm ), elm.tagName + ' is not block elm' );
  743. k--;
  744. }
  745. } );
  746. test( 'isbody', function() {
  747. var domUtils = te.obj[3];
  748. ok( domUtils.isBody( document.body ), 'is body' );
  749. } );
  750. /*parent参数是 node的直接父亲*/
  751. test( 'breakParent--一级祖先', function() {
  752. var div = te.dom[2];
  753. var domUtils = baidu.editor.dom.domUtils;
  754. div.innerHTML = '<p><span>xxxx</span><u><i>uitext</i></u><br /></p><div>xxxx</div>';
  755. var br = div.firstChild.lastChild;
  756. var returnNode = domUtils.breakParent( br, div.firstChild );
  757. equal( ua.getChildHTML( div ), '<p><span>xxxx</span><u><i>uitext</i></u></p><br><p></p><div>xxxx</div>' );
  758. equal( returnNode.tagName.toLowerCase(), 'br', 'check return value' );
  759. } );
  760. /*parent参数是 node的祖先节点*/
  761. test( 'breakParent--二级祖先', function() {
  762. var div = te.dom[2];
  763. var domUtils = baidu.editor.dom.domUtils;
  764. div.innerHTML = '<p><span>xxxx</span><u><i>uitext</i></u><br /></p><div>xxxx</div>';
  765. domUtils.breakParent( div.firstChild.firstChild.firstChild, div.firstChild );
  766. equal( ua.getChildHTML( div ), '<p><span></span></p>xxxx<p><span></span><u><i>uitext</i></u><br></p><div>xxxx</div>' );
  767. } );
  768. /*bookMark已在clearEmptySibling中验证*/
  769. test( 'isEmptyInlineElement', function() {
  770. var div = te.dom[2];
  771. var domUtils = baidu.editor.dom.domUtils;
  772. div.innerHTML = '<p><u><em></em></u><span>xxxx</span><u><i>uitext</i></u><br /></p><div>xxxx</div><div></div>';
  773. var p = div.firstChild;
  774. /*非空元素*/
  775. ok( !domUtils.isEmptyInlineElement( p ), 'is not empty' );
  776. /*空inline元素*/
  777. ok( domUtils.isEmptyInlineElement( p.firstChild ), 'u is empty' );
  778. ok( domUtils.isEmptyInlineElement( p.firstChild.firstChild ), 'em is empty' );
  779. /*块元素*/
  780. ok( !domUtils.isEmptyInlineElement( p.lastChild ), 'empty div is not inline' );
  781. } );
  782. test( 'trimWhiteTextNode', function() {
  783. var div = te.dom[2];
  784. var domUtils = baidu.editor.dom.domUtils;
  785. div.innerHTML = '\n\t <p><u><em></em></u><span>xxxx</span><u><i>uitext</i></u><br /></p><div>xxxx</div> ';
  786. domUtils.trimWhiteTextNode( div );
  787. equal( ua.getChildHTML( div ), '<p><u><em></em></u><span>xxxx</span><u><i>uitext</i></u><br></p><div>xxxx</div>', 'trim white textnode' );
  788. } );
  789. /*适用于inline节点*/
  790. test( 'mergeChild--span', function() {
  791. var div = te.dom[2];
  792. var domUtils = baidu.editor.dom.domUtils;
  793. var div_new = document.createElement( 'div' );
  794. div_new.id = 'test';
  795. div.innerHTML = '<span style="background-color:blue;"><span style="font-size:12px;color:red">span_1<span style="font-size:12px">span_2</span></span></span>';
  796. domUtils.mergeChild( div.firstChild.firstChild );
  797. /*span套span则进行合并*/
  798. div_new.innerHTML = '<span style="background-color:blue;"><span style="font-size:12px;color:red">span_1</span></span>';
  799. div_new.firstChild.firstChild.appendChild( document.createTextNode( 'span_2' ) );
  800. ok( ua.haveSameAllChildAttribs( div, div_new ), 'span套span则合并' );
  801. div.innerHTML = '<p><span style="font-size:12px;color:red">span_1<span style="font-size:12px">span_2</span></span></p>';
  802. domUtils.mergeChild( div.firstChild.firstChild );
  803. /*父节点style比子节点多,删去子节点*/
  804. div_new.innerHTML = '<p><span style="font-size:12px;color:red">span_1</span></p>' || ua.getChildHTML( div ) == '<p><span style="color:red;font-size:12px">span_1span_2</span></p>';
  805. div_new.firstChild.firstChild.appendChild( document.createTextNode( 'dpan_2' ) );
  806. ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点style比子节点多' );
  807. /*子节点style比父节点多,则不作调整*/
  808. div.innerHTML = '<p><span style="font-size:12px">span_1<span style="font-size:12px;color:red">span_2</span></span></p>';
  809. var span = div.firstChild.firstChild;
  810. domUtils.mergeChild( span );
  811. /*创建一个div,div的innerHTML与预期的结果相同,比较div_new与div的所有属性,从而判断style为预期结果*/
  812. var div_new = document.createElement( 'div' );
  813. div_new.id = 'test';
  814. div_new.innerHTML = '<p><span style="font-size:12px">span_1<span style="font-size:12px;color:red">span_2</span></span></p>';
  815. ok( ua.haveSameAllChildAttribs( div, div_new ), '子节点style比父节点多' );
  816. /*多个子节点和兄弟节点,有的子节点style比父节点多,有的少,有的不同*/
  817. div.innerHTML = '<p><span style="font-size:12px;color:red;left:10px">span_1<span style="font-size:12px">span_2</span><span style="top:10px">span_3</span><span style="color:red;left:10px;right:10px">span_4</span></span><span style="font-size:12px"></span></p>';
  818. domUtils.mergeChild( div.firstChild.firstChild );
  819. div_new.innerHTML = '<p><span style="font-size:12px;color:red;left:10px">span_2<span style="font-size:12px;color:red;left:10px;top:10px">span_3</span><span style="font-size:12px;color:red;left:10px;right:10px">span_4</span></span><span style="font-size:12px"></span></p>';
  820. var span1 = div_new.firstChild.firstChild;
  821. span1.insertBefore( document.createTextNode( 'span_1' ), span1.firstChild );
  822. ok( ua.haveSameAllChildAttribs( div, div_new ), '多个子节点和兄弟节点,有的子节点style比父节点多,有的少,有的不同' );
  823. } );
  824. test( 'mergeChild--非span', function() {
  825. var div = te.dom[2];
  826. var domUtils = baidu.editor.dom.domUtils;
  827. /*父节点和子节点属性不同*/
  828. div.innerHTML = '<b style="color:red;font-size:12px">b1<b style="font-size:12px;">b2</b></b>';
  829. var div_new = document.createElement( 'div' );
  830. div_new.id = 'test';
  831. div_new.innerHTML = '<b style="color:red;font-size:12px">b1<b style="font-size:12px;">b2</b></b>';
  832. domUtils.mergeChild( div.firstChild );
  833. ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点和子节点属性不同,则不操作' );
  834. /*父节点和子节点属性相同*/
  835. div.innerHTML = '<b style="color:red;font-size:12px">b1<b style="font-size:12px;color:red;">b2</b></b>';
  836. var div_new = document.createElement( 'div' );
  837. div_new.id = 'test';
  838. div_new.innerHTML = '<b style="color:red;font-size:12px">b1</b>';
  839. domUtils.mergeChild( div.firstChild );
  840. div_new.firstChild.appendChild( document.createTextNode( 'b2' ) );
  841. ok( ua.haveSameAllChildAttribs( div, div_new ), '父节点和子节点属性相同,则删子节点' );
  842. } );
  843. test( 'mergeChild--span--attrs', function() {
  844. var div = te.dom[2];
  845. var domUtils = baidu.editor.dom.domUtils;
  846. var div_new = document.createElement( 'div' );
  847. div_new.id = 'test';
  848. div.innerHTML = '<span style="background-color:blue;"><span style="font-size:12px;color:red">span_1<span style="font-size:12px">span_2</span></span></span>';
  849. var html = '<span style="font-size: 12px; color: red; background-color: blue;">span_1<span style="font-size: 12px; color: red; background-color: red;">span_2</span></span>';
  850. domUtils.mergeChild( div.firstChild ,'span',{style:'background-color:red'});
  851. ua.checkSameHtml(div.innerHTML,html,'mergeChild-给子节点中的span添加样式');
  852. } );
  853. test( 'getElementsByTagName', function() {
  854. var div = te.dom[2];
  855. var domUtils = baidu.editor.dom.domUtils;
  856. div.innerHTML = '<p><u><em></em></u><span>xxxx</span><u><i>uitext</i></u><br /></p><div>xxxx</div> <p>xxxx</p>';
  857. var elms = domUtils.getElementsByTagName( div, 'p' );
  858. equal( elms.length, 2, 'check elem count' );
  859. equal( elms[0].innerHTML.toLowerCase(), '<u><em></em></u><span>xxxx</span><u><i>uitext</i></u><br>', 'check first p' );
  860. equal( elms[1].innerHTML, 'xxxx', 'check second p' );
  861. } );
  862. test( 'mergeToParent--一个span孩子', function() {
  863. var div = te.dom[2];
  864. var domUtils = baidu.editor.dom.domUtils;
  865. div.innerHTML = '<span style="color:red;font-size:12px;"><span style="left:10px;right:20px;"></span></span>';
  866. domUtils.mergeToParent( div.firstChild.firstChild );
  867. var div_new = document.createElement( 'div' );
  868. div_new.innerHTML = '<span style=color:red;font-size:12px;left:10px;right:20px;></span>';
  869. ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent' );
  870. } );
  871. test( 'mergeToParent--一个span孩子,孩子css样式与父节点相同', function() {
  872. var div = te.dom[2];
  873. var domUtils = baidu.editor.dom.domUtils;
  874. div.innerHTML = '<span style="color:red;font-size:12px;"><span style="font-size:12px;color:red;">xxxxx</span></span>';
  875. domUtils.mergeToParent( div.firstChild.firstChild );
  876. var div_new = document.createElement( 'div' );
  877. div_new.innerHTML = '<span style="color:red;font-size:12px">xxxxx</span>';
  878. ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent,删除样式相同的子节点' );
  879. } );
  880. test( 'mergeToParent--多个span孩子,祖先节点不可被合并', function() {
  881. var div = te.dom[2];
  882. var domUtils = baidu.editor.dom.domUtils;
  883. div.innerHTML = '<span style="color:red;font-size:12px;"><span style="left:10px;right:20px;"></span><span style="top:10px"></span></span>';
  884. domUtils.mergeToParent( div.firstChild.firstChild );
  885. var div_new = document.createElement( 'div' );
  886. div_new.innerHTML = '<span style="color:red;font-size:12px;"><span style="left:10px;right:20px;color:red;font-size:12px;"></span><span style="top:10px"></span></span>';
  887. ok( ua.haveSameAllChildAttribs( div, div_new ), 'mergeTo parent--多个span孩子,' );
  888. } );
  889. //test( 'mergeToParent--a', function() {
  890. // var div = te.dom[2];
  891. // var domUtils = baidu.editor.dom.domUtils;
  892. // div.innerHTML = '<span style="text-decoration: line-through"><a href="http://www.baidu.com/">www.baidu.com</a></span>';
  893. //
  894. //
  895. //} );
  896. test( 'mergeToParent--其他inline节点', function() {
  897. var div = te.dom[2];
  898. var domUtils = baidu.editor.dom.domUtils;
  899. div.innerHTML = '<b>xxx<i>xxx<u>xxxx<em>xxx<i id="secondI"><b>xxxxxx</b></i></em></u></i></b>';
  900. var i = document.getElementById( 'secondI' );
  901. domUtils.mergeToParent( i.firstChild );
  902. ok( ua.getChildHTML( div ), '<b>xxx<i>xxx<u>xxxx<em>xxx<i>xxxxxx</i></em></u></i></b>' );
  903. domUtils.mergeToParent( i );
  904. ok( ua.getChildHTML( div ), '<b>xxx<i>xxx<u>xxxx<em>xxxxxxxxx</em></u></i></b>' );
  905. } );
  906. /*合并兄弟节点中有相同属性包括style的节点*/
  907. test( 'mergeSibling--左边没有兄弟', function() {
  908. var div = te.dom[2];
  909. var domUtils = baidu.editor.dom.domUtils;
  910. div.innerHTML = '<b>b1</b><b>b2</b><b id="b3">b3</b>';
  911. domUtils.mergeSibling( div.firstChild );
  912. ok( ua.getChildHTML( div ), '<b>b1b2</b><b id="b3">b3</b>' );
  913. } );
  914. test( 'mergeSibling--右边没有兄弟', function() {
  915. var div = te.dom[2];
  916. var domUtils = baidu.editor.dom.domUtils;
  917. div.innerHTML = '<b>b1</b><b>b2</b><b>b3</b>';
  918. domUtils.mergeSibling( div.lastChild );
  919. ok( ua.getChildHTML( div ), '<b>b1b2</b><b id="b3">b3</b>' );
  920. } );
  921. test( 'mergeSibling--兄弟节点没有孩子', function() {
  922. var div = te.dom[2];
  923. var domUtils = baidu.editor.dom.domUtils;
  924. div.innerHTML = '<b></b><b>b2</b><b id="b3">b3</b>';
  925. domUtils.mergeSibling( div.firstChild.nextSibling );
  926. ok( ua.getChildHTML( div ), '<b>b2</b><b id="b3">b3</b>' );
  927. } );
  928. test( 'trace 3983 unselectable--检查赋值是否成功', function() {
  929. var div = te.dom[2];
  930. var domUtils = baidu.editor.dom.domUtils;
  931. div.innerHTML = '<div><p>xxxx<span><b><i>xxx</i></b>xxxx</span></p>dddd<p><img /><a>aaaa</a></p></div>';
  932. debugger
  933. domUtils.unSelectable( div );
  934. if ( UE.browser.gecko || UE.browser.webkit || (UE.browser.ie &&UE.browser.version>8) ) {
  935. equal( div.style.MozUserSelect || div.style.KhtmlUserSelect || div.style.MSUserSelect, 'none', 'webkit or gecko unselectable' );
  936. } else {
  937. equal( div.unselectable, 'on', '检查unselectable属性' );
  938. for ( var i = 0,ci; ci = div.all[i++]; ) {
  939. equal( ci.unselectable, 'on', '检查子节点unselectable属性' );
  940. }
  941. }
  942. } );
  943. test( 'unselectable--检查是否真的不能选中', function() {
  944. var div = te.dom[2];
  945. var domUtils = baidu.editor.dom.domUtils;
  946. div.innerHTML = '<p>xxx</p>';
  947. //TODO ie下如何选中文本节点需要重新想一想,用程序选择文本貌似不会考虑unselectable属性,都是可以选中的
  948. if ( ! ua.browser.ie && !ua.browser.opera) {
  949. // var rng = document.body.createTextRange();
  950. // domUtils.unselectable( div );
  951. // rng.moveToElementText( div )
  952. // /*开始位置处向前移动一个字符,结束位置处向后移动一个字符*/
  953. // rng.moveEnd( 'character', 1 );
  954. // rng.moveStart( 'character', -1 );
  955. // rng.select();
  956. // equal( rng.text, '', 'after unselectable' );
  957. // } else {
  958. var r = te.obj[2];
  959. r.selectNode( div.firstChild ).select();
  960. equal( ua.getSelectedText(), 'xxx', 'before unselectable' );
  961. /*禁止选中*/
  962. domUtils.unSelectable( div );
  963. r.selectNode( div.firstChild ).select();
  964. equal( ua.getSelectedText(), '', 'after unselectable' );
  965. }
  966. } );
  967. /*不支持第二个参数为字符串,必须为数组*/
  968. //test( 'removeAttributes--删除一个属性', function() {
  969. // var div = te.dom[2];
  970. // div.innerHTML = '<div class="div_class" name="div_name"></div>';
  971. // var domUtils = baidu.editor.dom.domUtils;
  972. // domUtils.removeAttributes( div.firstChild, 'class' );
  973. // equal( ua.getChildHTML( div ), '<div name="div_name"></div>' );
  974. //} );
  975. test( 'removeAttributes--删除多个属性,包括style', function() {
  976. var div = te.dom[2];
  977. div.innerHTML = '<div class="div_class" name="div_name" style="color:red;font-size:12px"></div>';
  978. var domUtils = baidu.editor.dom.domUtils;
  979. /*诡异模式下className可以删除,而非诡异模式下不能删除*/
  980. domUtils.removeAttributes( div.firstChild, ['class','name','style'] );
  981. equal( ua.getChildHTML( div ), '<div></div>' );
  982. } );
  983. test( 'setAttributes--设置class,style', function() {
  984. var div = te.dom[2];
  985. var domUtils = baidu.editor.dom.domUtils;
  986. div.innerHTML = '<div></div>';
  987. domUtils.setAttributes( div.firstChild, {'class':'div_class','id':'div_id','style':'color:red;font-size:12px;'} );
  988. var div_new = document.createElement( 'div' );
  989. div_new.id = 'test';
  990. div_new.innerHTML = '<div class="div_class" id="div_id" style="color:red;font-size:12px"></div>';
  991. ok( ua.haveSameAllChildAttribs( div, div_new ), 'check attributes' );
  992. } );
  993. test( 'setAttributes--设置innerHTML,value', function() {
  994. var div = te.dom[2];
  995. var domUtils = baidu.editor.dom.domUtils;
  996. div.innerHTML = '<div></div>';
  997. domUtils.setAttributes( div.firstChild, {'innerHTML':'setAttributes_test','id':'div_id','value':'abcd'} );
  998. var div_new = document.createElement( 'div' );
  999. div_new.id = 'test';
  1000. div_new.innerHTML = '<div id="div_id" >setAttributes_test</div>';
  1001. div_new.firstChild.value="abcd";
  1002. ok( ua.haveSameAllChildAttribs( div, div_new ), 'check attributes' );
  1003. } );
  1004. test( 'getComputedStyle', function() {
  1005. var div = te.dom[2];
  1006. var domUtils = baidu.editor.dom.domUtils;
  1007. div.innerHTML = '<div class="div_class" name="div_name" style="color:red;font-size:12px"></div><span></span>';
  1008. equal( domUtils.getComputedStyle( div.firstChild, 'font-size' ), '12px' );
  1009. equal( domUtils.getComputedStyle( div.firstChild, 'display' ), 'block' );
  1010. equal( domUtils.getComputedStyle( div.lastChild, 'display' ), 'inline' );
  1011. equal( domUtils.getComputedStyle( div.firstChild, 'width' ),div.firstChild.offsetWidth + 'px');
  1012. div.innerHTML = '<div class="div_class" name="div_name" style="width:30px;"></div><span></span>';
  1013. equal( domUtils.getComputedStyle( div.firstChild, 'width' ),'30px');
  1014. } );
  1015. test( 'getComputedStyle--获取默认的背景色', function() {
  1016. var div = te.dom[2];
  1017. var domUtils = baidu.editor.dom.domUtils;
  1018. div.innerHTML = '<div>hello</div>';
  1019. /*chrome下不作特殊处理得到的结果是rgba(0,0,0,0),处理后是结果是“”*/
  1020. var result = baidu.editor.browser.webkit ? "" : "transparent";
  1021. equal( domUtils.getComputedStyle( div, 'background-color' ), result, '默认背景色为透明色' );
  1022. } );
  1023. test( 'getComputedStyle-border', function() {
  1024. var div = te.dom[2];
  1025. var domUtils = baidu.editor.dom.domUtils;
  1026. div.innerHTML = '<table style="border: 5px solid red"></table>';
  1027. equal( domUtils.getComputedStyle( div.firstChild, 'border-width' ), '5px' );
  1028. equal( domUtils.getComputedStyle( div.lastChild, 'border-style' ), 'solid' );
  1029. equal( domUtils.getComputedStyle( div.lastChild, 'border-color' ), 'red' );
  1030. } );
  1031. //修复ie下的一个bug,如果在body上强制设了字体大小,h1的字体大小就会继承body的字体,而没有办法取到真是的字体大小
  1032. test( 'getComputedStyle-在body上设置字体大小,检查h1字体大小', function() {
  1033. var domUtils = baidu.editor.dom.domUtils;
  1034. var editor = new baidu.editor.Editor({'autoFloatEnabled':false});
  1035. var div = document.body.appendChild( document.createElement( 'div' ) );
  1036. editor.render( div );
  1037. stop();
  1038. editor.ready(function(){
  1039. var body = editor.body;
  1040. var range = new baidu.editor.dom.Range( editor.document );
  1041. var h1 = body.appendChild( editor.document.createElement( 'h1' ) );
  1042. // editor.body.style['fontSize'] = '10px';
  1043. // h1的字体大小不是10px
  1044. var fontSize = (ua.browser.ie&&ua.browser.ie<9)?'33px':'32px';//todo 1.2.7 trace 3588
  1045. equal( domUtils.getComputedStyle( h1, 'font-size' ), fontSize, 'body的fontSize属性不应当覆盖p的fontSize属性' );
  1046. te.dom.push(div);
  1047. // editor.setContent( '<h2>这是h2的文本<a>这是一个超链接</a></h2>' );
  1048. start();
  1049. });
  1050. } );
  1051. /*不支持一个class的删除,必须为一个数组*/
  1052. //test( 'removeClasses--一个class', function() {
  1053. // var div = te.dom[2];
  1054. // var domUtils = baidu.editor.dom.domUtils;
  1055. // div.innerHTML = '<div class="div_class" name="div_name" style="color:red;font-size:12px"></div>';
  1056. // domUtils.removeClasses( div.firstChild, 'div_class' );
  1057. // ok( ua.getChildHTML( div ) == '<div name="div_name" style="color:red;font-size:12px"></div>' || ua.getChildHTML( div ) == '<div name="div_name" style="font-size:12px;color:red;"></div>' );
  1058. //} );
  1059. test( 'removeClasses--多个class', function() {
  1060. var div = te.dom[2];
  1061. var domUtils = baidu.editor.dom.domUtils;
  1062. div.innerHTML = '<div class="div_class div_class2 div_class3" name="div_name" style="color:red;font-size:12px"></div>';
  1063. var divChild = div.firstChild;
  1064. domUtils.removeClasses( divChild, ['div_class2' ,'div_class3','div_class'] );
  1065. equal( $.trim( divChild.className ), "", 'check className' );
  1066. equal( $( divChild ).attr( 'name' ), 'div_name', 'check name' );
  1067. equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' );
  1068. equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' );
  1069. equal( divChild.style[ 'color'], 'red', 'check red' );
  1070. } );
  1071. test( 'removeClasses--class包含”-“', function() {
  1072. var div = te.dom[2];
  1073. var domUtils = baidu.editor.dom.domUtils;
  1074. div.innerHTML = '<div class="b-b b-b-a " name="div_name" style="color:red;font-size:12px"></div>';
  1075. var divChild = div.firstChild;
  1076. domUtils.removeClasses( divChild, ['b-b'] );
  1077. equal( $.trim( divChild.className ), "b-b-a", 'check className' );
  1078. equal( $( divChild ).attr( 'name' ), 'div_name', 'check name' );
  1079. equal( $( divChild ).css( 'font-size' ), '12px', 'check font-size' );
  1080. equal( divChild.style[ 'color'], 'red', 'check red' );
  1081. div.innerHTML = '<div class="b-b b-b-a " name="div_name" style="color:red;font-size:12px"></div>';
  1082. domUtils.removeClasses( div.firstChild, ' b-b-a b-b' );
  1083. equal(div.firstChild.className,'')
  1084. } );
  1085. test( 'removeStyle--style不为空', function() {
  1086. var div = te.dom[2];
  1087. var domUtils = baidu.editor.dom.domUtils;
  1088. div.innerHTML = '<div name="div_name" style="color:red;font-size:12px"></div>';
  1089. domUtils.removeStyle( div.firstChild, 'font-size' );
  1090. var div_new = document.createElement( 'div' );
  1091. div_new.id = 'test';
  1092. div_new.innerHTML = '<div name="div_name" style="color:red; "></div>';
  1093. ok( ua.haveSameAllChildAttribs( div, div_new ), 'check removed style' );
  1094. } );
  1095. test( 'removeStyle--style不为空', function() {
  1096. var div = te.dom[2];
  1097. var domUtils = baidu.editor.dom.domUtils;
  1098. div.innerHTML = '<div name="div_name" style="border-left:1px solid #ccc"></div>';
  1099. domUtils.removeStyle( div.firstChild, 'border-left' );
  1100. var div_new = document.createElement( 'div' );
  1101. div_new.id = 'test';
  1102. div_new.innerHTML = '<div name="div_name" ></div>';
  1103. ok( ua.haveSameAllChildAttribs( div, div_new ), 'check removed style' );
  1104. } );
  1105. test( 'removeStyle--style为空', function() {
  1106. var div = te.dom[2];
  1107. var domUtils = baidu.editor.dom.domUtils;
  1108. div.innerHTML = '<div name="div_name"></div>';
  1109. domUtils.removeStyle( div.firstChild, 'color' );
  1110. equal( ua.getChildHTML( div ), '<div name="div_name"></div>', ' style为空' );
  1111. } );
  1112. test( 'hasClass', function() {
  1113. var div = te.dom[2];
  1114. var domUtils = baidu.editor.dom.domUtils;
  1115. div.innerHTML = '<div class="div_class div_class2 div_class3" name="div_name" style="color:red;font-size:12px"></div>';
  1116. var divChild = div.firstChild;
  1117. ok( domUtils.hasClass( divChild, 'div_class3' ), '有这个class' );
  1118. ok( !domUtils.hasClass( divChild, 'div' ), '木有这个class' );
  1119. div.firstChild.className = 'a b c';
  1120. ok(domUtils.hasClass(div.firstChild,'b c a'))
  1121. } );
  1122. test( 'addClass', function() {
  1123. var div = te.dom[2];
  1124. var domUtils = baidu.editor.dom.domUtils;
  1125. div.innerHTML = '<div name="div_name" style="color:red;font-size:12px"></div>';
  1126. domUtils.addClass(div.firstChild,'div_class div_class2 div_class3');
  1127. equal(utils.trim(div.firstChild.className),div.firstChild.className,'判断是否有前后空格');
  1128. domUtils.addClass(div.firstChild,'div_class4');
  1129. equal(div.firstChild.className,'div_class div_class2 div_class3 div_class4','增加class4');
  1130. domUtils.addClass(div.firstChild,'div_class4');
  1131. equal(div.firstChild.className,'div_class div_class2 div_class3 div_class4','再增加class4');
  1132. } );
  1133. test( "preventDefault", function() {
  1134. expect( 1 );
  1135. var div = te.dom[2];
  1136. var domUtils = baidu.editor.dom.domUtils;
  1137. /*img用来撑大页面*/
  1138. var img = document.createElement( 'img' );
  1139. img.src = upath + 'test.jpg';
  1140. img.style.height = "2000px";
  1141. div.appendChild( img );
  1142. document.body.appendChild( div );
  1143. var a = document.createElement( 'a' );
  1144. a.setAttribute( "href", "#" );
  1145. a.innerHTML = 'ToTop';
  1146. a.target = '_self';
  1147. document.body.appendChild( a );
  1148. window.scrollTo( 0, document.body.scrollHeight );
  1149. // UserAction.beforedispatch = function( e ) {
  1150. // e = e || window.event;
  1151. // domUtils.preventDefault( e );
  1152. // };
  1153. a.onclick = function( e ) {
  1154. domUtils.preventDefault( e );
  1155. }
  1156. UserAction.click( a );
  1157. var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
  1158. ok( top != 0, "preventDefault" );
  1159. document.body.removeChild( a );
  1160. } );
  1161. test( 'getStyle--color is red', function() {
  1162. var div = te.dom[2];
  1163. var domUtils = baidu.editor.dom.domUtils;
  1164. div.innerHTML = '<div class="div_class div_class2 div_class3" name="div_name" style="top:13px;color:red;font-size:12px"></div>';
  1165. equal( domUtils.getStyle( div.firstChild, 'color' ), 'red', 'check color' );
  1166. equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' );
  1167. equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' );
  1168. } );
  1169. test( 'getStyle--color is rgb', function() {
  1170. var div = te.dom[2];
  1171. var domUtils = baidu.editor.dom.domUtils;
  1172. div.innerHTML = '<div class="div_class div_class2 div_class3" name="div_name" style="top:13px;color:rgb(255,0,0);font-size:12px"></div>';
  1173. equal( domUtils.getStyle( div.firstChild, 'color' ), '#FF0000', 'check color' );
  1174. equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' );
  1175. equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' );
  1176. } );
  1177. test( 'getStyle--color is #ff0000', function() {
  1178. var div = te.dom[2];
  1179. var domUtils = baidu.editor.dom.domUtils;
  1180. div.innerHTML = '<div class="div_class div_class2 div_class3" name="div_name" style="top:13px;color:#ff0000;font-size:12px"></div>';
  1181. equal( domUtils.getStyle( div.firstChild, 'color' ).toUpperCase(), '#FF0000', 'check color' );
  1182. equal( domUtils.getStyle( div.firstChild, 'font-size' ), '12px', 'check font size' );
  1183. equal( domUtils.getStyle( div.firstChild, 'top' ), '13px', 'check top' );
  1184. } );
  1185. //test( 'getStyle--border', function() {
  1186. // var div = te.dom[2];
  1187. // div.innerHTML = '<table style="border: 5px solid red"><tr><td></td></tr></table>';
  1188. //} );
  1189. test( 'removeDirtyAttr', function() {
  1190. var div = te.dom[2];
  1191. var domUtils = baidu.editor.dom.domUtils;
  1192. div.innerHTML = '<div><span>xxx</span><img /></div>xx';
  1193. $( div ).attr( '_moz_dirty', 'xxxx' );
  1194. for ( var i = 0,ci,nodes = div.getElementsByTagName( '*' ); ci = nodes[i++]; ) {
  1195. $( ci ).attr( '_moz_dirty', 'xxx' );
  1196. }
  1197. domUtils.removeDirtyAttr( div );
  1198. for ( var i = 0,ci,nodes = div.getElementsByTagName( '*' ); ci = nodes[i++]; ) {
  1199. equal( $( ci ).attr( '_moz_dirty' ), undefined, 'check dirty attr ' );
  1200. }
  1201. equal( $( div ).attr( '_moz_dirty' ), undefined, 'check dirty attr' );
  1202. } );
  1203. test( 'getChildCount', function() {
  1204. var div = te.dom[2];
  1205. var domUtils = baidu.editor.dom.domUtils;
  1206. div.innerHTML = '<div name="div_name" style="top:13px;color:#ff0000;font-size:12px"><p><span>xxx<b><u></u></b></span></p><span>xxxx</span>xxx<img/>xxx</div>';
  1207. var divChild = div.firstChild;
  1208. equal( domUtils.getChildCount( div ), 1, 'one childNode' );
  1209. equal( domUtils.getChildCount( divChild ), 5, '5 childs' );
  1210. equal( domUtils.getChildCount( divChild.firstChild.firstChild ), 2, 'inline span' );
  1211. equal( domUtils.getChildCount( divChild.lastChild ), 0, 'text node have no child' );
  1212. equal( domUtils.getChildCount( divChild.lastChild.previousSibling ), 0, 'img have no child' );
  1213. } );
  1214. test( 'setStyle', function() {
  1215. var div = te.dom[2];
  1216. var domUtils = baidu.editor.dom.domUtils;
  1217. div.innerHTML = '<div style="float: left"><p style="background: red"></p></div>';
  1218. /*修改float值*/
  1219. domUtils.setStyle( div.firstChild, 'float', 'right' );
  1220. equal( $( div.firstChild ).css( 'float' ), 'right', '浮动方式改为了right' );
  1221. domUtils.setStyle( div.firstChild.firstChild, 'text-indent', '10px' );
  1222. equal( $( div.firstChild.lastChild ).css( 'text-indent' ), '10px', '设置了缩进样式' );
  1223. } );
  1224. test( 'setStyles', function() {
  1225. var div = te.dom[2];
  1226. var domUtils = baidu.editor.dom.domUtils;
  1227. div.innerHTML = '<div style="float: left"><p style="background: red"></p></div>';
  1228. /*修改float值*/
  1229. domUtils.setStyles( div.firstChild, {'float':'right','text-align':'center'} );
  1230. equal( $( div.firstChild ).css( 'float' ), 'right', '浮动方式改为了right' );
  1231. equal( $( div.firstChild.lastChild ).css( 'text-align' ), 'center', '设置了对齐方式样式' );
  1232. } );
  1233. //zhuwenxuan add
  1234. //test( 'clearReduent', function() {
  1235. // var div = te.dom[2];
  1236. // var domUtils = baidu.editor.dom.domUtils;
  1237. // //没有内容
  1238. // div.innerHTML = '<div><b><i></i></b></div>';
  1239. // document.body.appendChild(div);
  1240. // domUtils.clearReduent(div,["i","b"]);
  1241. // ok( "<div></div>",div.innerHTML );
  1242. // //有内容
  1243. // div.innerHTML = '<div><b><i>ddd</i></b></div>';
  1244. // domUtils.clearReduent(div,["i","b"]);
  1245. // ok( "<div><b><i>ddd</i></b></div>",div.innerHTML );
  1246. // div.innerHTML = '<div><i>ddd</i><b></b></div>';
  1247. // domUtils.clearReduent(div,["i","b"]);
  1248. // ok( "<div><i>ddd</i></div>",div.innerHTML );
  1249. //} );
  1250. //zhuwenxuan add
  1251. test( 'isEmptyNode', function() {
  1252. var div = te.dom[2];
  1253. var domUtils = baidu.editor.dom.domUtils;
  1254. div.innerHTML = " \t\t\n\r";
  1255. ok(domUtils.isEmptyNode(div));
  1256. div.innerHTML = '<div><i></i><b>dasdf</b></div>';
  1257. equal(false,domUtils.isEmptyNode(div));
  1258. } );
  1259. //zhuwenxuan add
  1260. test( 'clearSelectedArr', function() {
  1261. var domUtils = baidu.editor.dom.domUtils;
  1262. var div = te.dom[2];
  1263. var span = document.createElement("span");
  1264. div.className = "aaa";
  1265. span.className = "span";
  1266. document.body.appendChild(div);
  1267. document.body.appendChild(span);
  1268. var arr = [];
  1269. arr.push(div);
  1270. arr.push(span);
  1271. domUtils.clearSelectedArr(arr);
  1272. equal("",div.className);
  1273. equal("",span.className);
  1274. } );
  1275. //zhuwenxuan add
  1276. test( 'isBr', function() {
  1277. var domUtils = baidu.editor.dom.domUtils;
  1278. var div = te.dom[2];
  1279. div.innerHTML = "<br>";
  1280. equal(true,domUtils.isBr(div.firstChild));
  1281. } );
  1282. //zhuwenxuan add
  1283. test( 'isFillChar', function() {
  1284. var domUtils = baidu.editor.dom.domUtils;
  1285. var div = te.dom[2];
  1286. domUtils.fillNode(document,div);
  1287. if(ua.browser.ie){
  1288. ok(domUtils.isFillChar(div.lastChild));
  1289. }
  1290. var node = document.createTextNode(domUtils.fillChar + 'sdfsdf');
  1291. ok(domUtils.isFillChar(node,true));
  1292. ok(!domUtils.isFillChar(node));
  1293. node = document.createTextNode(domUtils.fillChar +domUtils.fillChar);
  1294. ok(domUtils.isFillChar(node,true));
  1295. ok(domUtils.isFillChar(node))
  1296. } );
  1297. //zhuwenxuan add
  1298. test( 'isStartInblock', function() {
  1299. var domUtils = baidu.editor.dom.domUtils;
  1300. var div = te.dom[2];
  1301. var range = new baidu.editor.dom.Range( document );
  1302. domUtils.fillNode(document,div);
  1303. range.setStart(div,0);
  1304. ok(domUtils.isStartInblock(range));
  1305. div.innerHTML = "asdfasdf";
  1306. range.setStart(div,2);
  1307. equal(0,domUtils.isStartInblock(range))
  1308. } );
  1309. //zhuwenxuan add
  1310. test( 'isEmptyBlock', function() {
  1311. var domUtils = baidu.editor.dom.domUtils;
  1312. var div = te.dom[2];
  1313. domUtils.fillNode(document,div);
  1314. ok(domUtils.isEmptyBlock(div));
  1315. var span = document.createElement("span");
  1316. equal(1,domUtils.isEmptyBlock(span));
  1317. span.innerHTML = "asdf";
  1318. equal(0,domUtils.isEmptyBlock(span));
  1319. } );
  1320. //zhuwenxuan add
  1321. test( 'fillNode', function() {
  1322. var domUtils = baidu.editor.dom.domUtils;
  1323. var div = te.dom[2];
  1324. domUtils.fillNode(document,div);
  1325. ok(div.innerHTML.length>0);
  1326. } );
  1327. //zhuwenxuan add
  1328. test( 'moveChild', function() {
  1329. var domUtils = baidu.editor.dom.domUtils;
  1330. var div = te.dom[2];
  1331. div.innerHTML = "div child";
  1332. var p = document.createElement("p");
  1333. domUtils.moveChild(div,p);
  1334. equal("div child",p.innerHTML);
  1335. p.innerHTML = "";
  1336. div.innerHTML = "<span>asdf</span>";
  1337. domUtils.moveChild(div,p);
  1338. equal("<span>asdf</span>",p.innerHTML.toLowerCase());
  1339. } );
  1340. test( 'hasNoAttributes', function() {
  1341. var domUtils = baidu.editor.dom.domUtils;
  1342. var div = te.dom[2];
  1343. div.innerHTML = "<span>sdf</span>";
  1344. ok(domUtils.hasNoAttributes(div.firstChild));
  1345. div.firstChild.style.cssText = 'font-size:12px';
  1346. ok(!domUtils.hasNoAttributes(div.firstChild));
  1347. domUtils.removeAttributes(div.firstChild,['style']);
  1348. ok(domUtils.hasNoAttributes(div.firstChild));
  1349. div.innerHTML = '<span custorm>sf</span>';
  1350. ok(!domUtils.hasNoAttributes(div.firstChild));
  1351. } );
  1352. test( 'isTagNode', function() {
  1353. var domUtils = baidu.editor.dom.domUtils;
  1354. var div = te.dom[2];
  1355. div.innerHTML = "<p><span>sdf</span></p>";
  1356. ok(domUtils.isTagNode(div.firstChild,"p"));
  1357. ok(domUtils.isTagNode(div.firstChild.firstChild,"span"));
  1358. } );
  1359. test( 'filterNodelist', function() {
  1360. var div = te.dom[2];
  1361. div.innerHTML = '<span></span><span></span><i></i><i></i><i></i>';
  1362. var arr = domUtils.filterNodeList(div.getElementsByTagName('*'),'i span');
  1363. equals(arr.tagName,"SPAN");
  1364. arr = domUtils.filterNodeList(div.getElementsByTagName('*'),'i');
  1365. equals(arr.tagName,'I');
  1366. arr = domUtils.filterNodeList(div.getElementsByTagName('*'),function(n){
  1367. return n.tagName == 'SPAN'
  1368. });
  1369. equals(arr.tagName,'SPAN');
  1370. arr = domUtils.filterNodeList(div.getElementsByTagName('*'),function(n){
  1371. return n.tagName == 'SPAN'
  1372. },true);
  1373. equals(arr.length,2)
  1374. } );
  1375. test('inNodeEndBoundary',function(){
  1376. var div = te.dom[2];
  1377. div.innerHTML = "<span><b>span</b><a>aa</a></span><b>sp</b>";
  1378. var range = te.obj[2];
  1379. range.setStart(div.firstChild.lastChild.firstChild,2).collapse(1).select();
  1380. range.createBookmark();
  1381. ok(domUtils.isInNodeEndBoundary(range,div.firstChild),'firstchild.lastchild边界');
  1382. range.setStart(div.firstChild.firstChild.firstChild,4).collapse(1).select();
  1383. range.createBookmark();
  1384. ok(!domUtils.isInNodeEndBoundary(range,div.firstChild),'firstchild.firstchild边界');
  1385. range.setStart(div.lastChild.firstChild,2).collapse(1).select();
  1386. range.createBookmark();
  1387. ok(domUtils.isInNodeEndBoundary(range,div),'lastchild边界');
  1388. });
  1389. //test( '闭合选区,标签边界', function() {
  1390. // var domUtils = baidu.editor.dom.domUtils;
  1391. // var div = te.dom[2];
  1392. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1393. // editor.render( div );
  1394. // var range = new baidu.editor.dom.Range( editor.document );
  1395. // editor.setContent( '<a>a_text1</a><a>a_text2</a>' );
  1396. // var a = editor.body.firstChild.firstChild;
  1397. // range.setStart( a, 0 ).collapse( 1 ).select();
  1398. // same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a, '选区位置为(a,0)' );
  1399. // range.setStart( a, 1 ).collapse( 1 ).select();
  1400. // same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a, '选区位置为(a,1)' );
  1401. //
  1402. // range.setStart( a.parentNode, 1 ).collapse( 1 ).select();
  1403. // same( domUtils.findTagNamesInSelection( range, ['h2','a','p'] ), a.parentNode, '选区位置为(p,1)' );
  1404. // same( domUtils.findTagNamesInSelection( range, ['h2','a'] ), null, '选区位置为(p,1),但是不符合查找的条件' );
  1405. //} );
  1406. //test( '<strong style="color:red">文本闭合选区</strong>中查找是否包含特定的标签列表', function() {
  1407. // var domUtils = baidu.editor.dom.domUtils;
  1408. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1409. // var div = te.dom[2];
  1410. // editor.render( div );
  1411. // var range = new baidu.editor.dom.Range( editor.document );
  1412. // var body = editor.body;
  1413. //
  1414. // editor.setContent( '<h2 id="tt-h2">我是测试的header:h2</h2><p id="tt-p"><strong>xx乐乐乐乐x</strong><a id="tt-a">我是标签</a></p>' );
  1415. // var expectH2 = editor.document.getElementById( 'tt-h2' ),
  1416. // expectA = editor.document.getElementById( 'tt-a' );
  1417. //
  1418. // //闭合情况下,文本节点里
  1419. // var textH2 = body.firstChild.firstChild;
  1420. // range.setStart( textH2, 2 ).collapse( true ).select();
  1421. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2中,tag顺序:[h2, a, h3]' );
  1422. // range.setStart( textH2, 0 ).collapse( true ).select();
  1423. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2的左边界,tag顺序:[h2, a, h3]' );
  1424. // range.setStart( textH2, 14 ).collapse( true ).select();
  1425. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在h2的右边界,tag顺序:[h2, a, h3]' );
  1426. //
  1427. // var p = editor.document.getElementsByTagName('p')[0];
  1428. // var textA = p.lastChild.firstChild;
  1429. // range.setStart( textA, 2 ).collapse( true ).select();
  1430. // ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a中,tag顺序:[h2, a, h3]' );
  1431. // range.setStart( textA, 0 ).collapse( true ).select();
  1432. // ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a的左边界,tag顺序:[h2, a, h3]' );
  1433. // range.setStart( textA, 4 ).collapse( true ).select();
  1434. // ok( expectA === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在a的右边界,tag顺序:[h2, a, h3]' );
  1435. //
  1436. // var textStrong = p.firstChild.firstChild;
  1437. // range.setStart( textStrong, 2 ).collapse( true ).select();
  1438. // ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p中,tag顺序:[h2, a, h3]' );
  1439. // range.setStart( textStrong, 0 ).collapse( true ).select();
  1440. // ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p的左边界,tag顺序:[h2, a, h3]' );
  1441. // range.setStart( textStrong, 7 ).collapse( true ).select();
  1442. // ok( null == domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '闭合情况下,cursor在p的右边界,tag顺序:[h2, a, h3]' );
  1443. //} );
  1444. //test( '<strong style="color:red">不闭合选区</strong>中查找,如果包含,则返回第一个dom节点', function() {
  1445. // var domUtils = baidu.editor.dom.domUtils;
  1446. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1447. // var div = te.dom[2];
  1448. // editor.render( div );
  1449. // var range = new baidu.editor.dom.Range( editor.document );
  1450. // var body = editor.body;
  1451. //
  1452. // editor.setContent( '<h2 id="tt-h2">我是测试的header:h2</h2><p id="tt-p"><strong>xx乐乐乐乐x</strong><a id="tt-a">我是标签</a></p>' );
  1453. // var expectH2 = editor.document.getElementById( 'tt-h2' ),
  1454. // expectA = editor.document.getElementById( 'tt-a' );
  1455. // var textH2 = body.firstChild.firstChild;
  1456. // range.setStart( textH2, 3 ).setEnd( textH2, 9 ).select();
  1457. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '选中单个节点的一部分:tag顺序:[h2, a, h3]' );
  1458. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '选中单个节点的一部分:tag顺序:[a, h2, h3]' );
  1459. //
  1460. // range.setStart( textH2, 0 ).setEnd( textH2, 14 ).select();
  1461. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '选中单个节点的全部:tag顺序:[h2, a, h3]' );
  1462. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '选中单个节点的全部:tag顺序:[a, h2, h3]' );
  1463. //
  1464. // var p = editor.document.getElementsByTagName('p')[0];
  1465. // range.setStart( textH2, 0 ).setEnd(p.lastChild.firstChild, 3 ).select();
  1466. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['h2', 'a', 'h3'] ), '跨节点选中:tag顺序:[h2, a, h3]' );
  1467. // ok( expectA === domUtils.findTagNamesInSelection( range, ['a', 'h2', 'h3'] ), '跨节点选中:tag顺序:[a, h2, h3]' );
  1468. //} );
  1469. //test( '不闭合选区,选区包含<strong style="color:red">前半个</strong>半个标签', function() {
  1470. // var domUtils = baidu.editor.dom.domUtils;
  1471. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1472. // var div = te.dom[2];
  1473. // editor.render( div );
  1474. // var body = editor.body;
  1475. // var range = new baidu.editor.dom.Range( editor.document );
  1476. // editor.setContent( '<h2>这是h2的文本<a>这是一个超链接</a></h2>' );
  1477. // var a = body.firstChild.lastChild;
  1478. // range.setStart( body, 0 ).setEnd( a.firstChild, 3 ).select();
  1479. // same( domUtils.findTagNamesInSelection( range, ['a','h2','body','p'] ), a, '选择h2和a的前半部分标签,找到第一个为a' );
  1480. // /*调换查找的数组中元素的顺序*/
  1481. // same( domUtils.findTagNamesInSelection( range, ['h2','a','body','p'] ), body.firstChild, '选择h2和a的前半部分标签,找到第一个为h2' );
  1482. //} );
  1483. //test( '不闭合选区,选区包含<strong style="color:red">后半个</strong>标签', function() {
  1484. // var domUtils = baidu.editor.dom.domUtils;
  1485. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1486. // var div = te.dom[2];
  1487. // editor.render( div );
  1488. // var body = editor.body;
  1489. // var range = new baidu.editor.dom.Range( editor.document );
  1490. // editor.setContent( '<h2>这是h2的文本<a>这是一个超链接</a></h2>' );
  1491. // var a = body.firstChild.lastChild;
  1492. // range.setStart( a.firstChild, 3 ).setEnd( body, 1 ).select();
  1493. // same( domUtils.findTagNamesInSelection( range, ['a','h2','body','p'] ), a, '选择h2和a的后部分标签,找到第一个为a' );
  1494. // /*调换查找的数组中元素的顺序*/
  1495. // same( domUtils.findTagNamesInSelection( range, ['h2','a','body','p'] ), body.firstChild, '选择h2和a的后部分标签,找到第一个为h2' );
  1496. //} );
  1497. //test( '不闭合选区,选区包含2个相同的标签', function() {
  1498. // var domUtils = baidu.editor.dom.domUtils;
  1499. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1500. // var div = te.dom[2];
  1501. // editor.render( div );
  1502. // var body = editor.body;
  1503. // var range = new baidu.editor.dom.Range( editor.document );
  1504. // editor.setContent( '<p><a>a_text1</a><a>a_tex2</a></p>' );
  1505. // var a = body.firstChild.firstChild;
  1506. // range.setStart( body.firstChild, 0 ).setEnd( body.firstChild, 2 ).select();
  1507. // same( domUtils.findTagNamesInSelection( range, ['a'] ), a, '选区包含2个完整的a,选择第一个a' );
  1508. //
  1509. // range.setStart( body.firstChild, 0 ).setEnd( body.firstChild, 2 ).select();
  1510. // same( domUtils.findTagNamesInSelection( range, ['p','a'] ), body.firstChild, '选区包含2个完整的a,选择p' );
  1511. //
  1512. // range.setStart( a, 0 ).setEnd( a.nextSibling, 1 ).select();
  1513. // same( domUtils.findTagNamesInSelection( range, ['a'] ), a, '选区包含2个不完整的a,选择第一个a' );
  1514. //} );
  1515. //test( '不闭合选区,选区紧挨着标签边界', function() {
  1516. // var domUtils = baidu.editor.dom.domUtils;
  1517. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1518. // var div = te.dom[2];
  1519. // editor.render( div );
  1520. // var body = editor.body;
  1521. // var range = new baidu.editor.dom.Range( editor.document );
  1522. // editor.setContent( '<p><a>a_text1</a>a_text3<a>a_tex2</a></p>' );
  1523. // range.selectNode( body.firstChild.childNodes[1] ).select();
  1524. // same( domUtils.findTagNamesInSelection( range, ['a'] ), null, '选区紧挨着a边缘,找a返回null' );
  1525. //
  1526. // same( domUtils.findTagNamesInSelection( range, ['a','p'] ), body.firstChild, '选区紧挨着a边缘,找p返回p' );
  1527. //} );
  1528. //test( '不闭合选区,多节点,压力测试', function() {
  1529. // var domUtils = baidu.editor.dom.domUtils;
  1530. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1531. // var div = te.dom[2];
  1532. // editor.render( div );
  1533. // var body = editor.body;
  1534. // var range = new baidu.editor.dom.Range( editor.document );
  1535. // editor.setContent( '<p><strong><em>我是p里的文本<span style="color:red">textTD2</span></em></strong></p><table><tbody><tr><td>textTD1</td><td><ol><li><p>我是列表1</p><p><strong><em>我是p里的文本<span style="color:red">textTD2</span></em></strong></p></li><li><strong><em>我是li 2里的文本<span style="color:red">textTD2</span></em></strong><p><strong><em>TextEM1<span id="spanID" style="color:red">我是列表2里的文本</span></em></strong></p></li></ol></td></tr></tbody></table>' );
  1536. // var span = editor.document.getElementById( 'spanID' );
  1537. // range.selectNode( span.firstChild ).select();
  1538. // same(domUtils.findTagNamesInSelection(range,['div','pre','a','h1','h2','h3','h4','h5','h6','h7','table']),body.getElementsByTagName('table')[0],'深节点');
  1539. //} );
  1540. //test( '<strong style="color:red">control range</strong>中查找是否包含特定的标签列表', function() {
  1541. // var domUtils = baidu.editor.dom.domUtils;
  1542. // var editor = new baidu.editor.ui.Editor({autoFloatEnabled:true});
  1543. // var div = te.dom[2];
  1544. // editor.render( div );
  1545. // var range = new baidu.editor.dom.Range( editor.document );
  1546. //
  1547. // editor.setContent( '<span id="tt-span">test_</span><img id="tt-h2" src="http://www.baidu.com/img/baidu_sylogo1.gif"/><p id="tt-p"><strong>xx乐乐乐乐x</strong><a id="tt-a">我是标签</a></p>' );
  1548. // var expectH2 = editor.document.getElementById( 'tt-h2' ),
  1549. // expectA = editor.document.getElementById( 'tt-a' ),
  1550. // expectSpan = editor.document.getElementById( 'tt-span' );
  1551. //
  1552. //
  1553. // range.setStart(expectH2, 0).setEnd(expectA, 0).select();
  1554. // ok( expectA === domUtils.findTagNamesInSelection( range, ['a', 'img', 'h3'] ), 'tag顺序:[a, img, h3]' );
  1555. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['img', 'a', 'h3'] ), 'tag顺序:[img, a, h3]' );
  1556. //
  1557. //
  1558. // range.setStart(expectSpan, 0).setEnd(expectH2, 1).select();
  1559. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['a', 'img', 'h3'] ), 'tag顺序:[a, img, h3]' );
  1560. // ok( expectH2 === domUtils.findTagNamesInSelection( range, ['img', 'a', 'h3'] ), 'tag顺序:[img, a, h3]' );
  1561. //} );