--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+ <title>CKEDITOR.dom.walker</title>\r
+ <link rel="stylesheet" type="text/css" href="../../test.css" />\r
+ <script type="text/javascript" src="../../../ckeditor.js"></script>\r
+ <script type="text/javascript" src="../../test.js"></script>\r
+ <script type="text/javascript">\r
+ //<![CDATA[\r
+\r
+var tc;\r
+\r
+CKEDITOR.test.addTestCase( tc = (function()\r
+{\r
+ // Local reference to the "assert" object.\r
+ var assert = CKEDITOR.test.assert;\r
+\r
+ var doc = new CKEDITOR.dom.document( document );\r
+\r
+ function assertNodesList( wanted, nodes )\r
+ {\r
+ var simplifiedNodes = [];\r
+\r
+ for ( var i = 0 ; i < nodes.length ; i++ )\r
+ simplifiedNodes.push( nodes[i].type == CKEDITOR.NODE_TEXT ? nodes[i].getText() : ( '<' + nodes[i].getName() + '>' ) );\r
+\r
+ assert.areSame( wanted.toString(), simplifiedNodes.toString() );\r
+ }\r
+\r
+ return {\r
+\r
+ test_collapsed : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+\r
+ range.setStartAt( node.getFirst(), CKEDITOR.POSITION_AFTER_START );\r
+ range.collapse( true );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ assert.isNull( walker.next() );\r
+ },\r
+\r
+ test_next_1 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.next() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<p>', 'This is ', '<b>', 'a ', '<i>', 'simple', ' test' ], nodes );\r
+ },\r
+\r
+ test_next_2 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getFirst(), CKEDITOR.POSITION_AFTER_START );\r
+ range.setEnd( node.getChild( [0,1,1,0] ), 2 );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.next() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ 'This is ', '<b>', 'a ', '<i>', 'si' ], nodes );\r
+ },\r
+\r
+ test_next_3 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 1 ), CKEDITOR.POSITION_BEFORE_START );\r
+ range.setEndAt( node.getChild( 1 ), CKEDITOR.POSITION_AFTER_START );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.next() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<h1>' ], nodes );\r
+ },\r
+\r
+ test_next_4 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 0 ), CKEDITOR.POSITION_BEFORE_END );\r
+ range.setEndAt( node.getChild( 0 ), CKEDITOR.POSITION_AFTER_END );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.next() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [], nodes );\r
+ },\r
+\r
+ test_next_5 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 0 ), CKEDITOR.POSITION_BEFORE_END );\r
+ range.setEndAt( node.getChild( 1 ), CKEDITOR.POSITION_AFTER_START );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.next() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<h1>' ], nodes );\r
+ },\r
+\r
+ test_previous_1 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.previous() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<p>', ' test', '<b>', '<i>', 'simple', 'a ', 'This is ' ], nodes );\r
+ },\r
+\r
+ test_previous_2 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setEnd( node.getChild( [0,0] ), 2 );\r
+ range.setEnd( node.getChild( [0,1,1,0] ), 2 );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.previous() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ 'si', 'a ', 'is is ' ], nodes );\r
+ },\r
+\r
+ test_previous_3 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 1 ), CKEDITOR.POSITION_BEFORE_START );\r
+ range.setEndAt( node.getChild( 1 ), CKEDITOR.POSITION_AFTER_START );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.previous() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '' ], nodes );\r
+ },\r
+\r
+ test_previous_4 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 0 ), CKEDITOR.POSITION_BEFORE_END );\r
+ range.setEndAt( node.getChild( 0 ), CKEDITOR.POSITION_AFTER_END );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.previous() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<p>' ], nodes );\r
+ },\r
+\r
+ test_previous_5 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>Test</p><h1>More</h1>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( node.getChild( 0 ), CKEDITOR.POSITION_BEFORE_END );\r
+ range.setEndAt( node.getChild( 1 ), CKEDITOR.POSITION_AFTER_START );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+\r
+ var nodes = [];\r
+ while ( ( node = walker.previous() ) )\r
+ nodes.push( node );\r
+\r
+ assertNodesList( [ '<p>' ], nodes );\r
+ },\r
+\r
+ /**\r
+ * Test guard function is invoked on every move when iterating forward.\r
+ */\r
+ test_guard_1 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+ var nodes = [];\r
+\r
+ walker.guard = function( node )\r
+ {\r
+ nodes.push( node );\r
+ return true;\r
+ };\r
+\r
+ while ( ( node = walker.next() ) )\r
+ { /*jsl:pass*/ }\r
+\r
+ assertNodesList( [ '<p>', 'This is ', '<b>', 'a ', '<i>', 'simple', '<i>', '<b>',' test' , '<p>' ], nodes );\r
+ },\r
+\r
+ /**\r
+ * Test guard function is invoked on every move when iterating backward.\r
+ */\r
+ test_guard_2 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+ var nodes = [];\r
+\r
+ walker.guard = function( node )\r
+ {\r
+ nodes.push( node );\r
+ return true;\r
+ };\r
+\r
+ while ( ( node = walker.previous() ) )\r
+ { /*jsl:pass*/ }\r
+\r
+ assertNodesList( [ '<p>', ' test', '<b>', '<i>', 'simple', '<i>', 'a ', '<b>', 'This is ', '<p>' ], nodes );\r
+ },\r
+\r
+ /**\r
+ * Test evaluator function is invoked on every step when iterating backward.\r
+ */\r
+ test_evaluator_1 : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<p>This is <b>a <i>simple</i></b> test</p>' );\r
+\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+ var nodes = [];\r
+\r
+ walker.evaluator = function( node )\r
+ {\r
+ nodes.push( node );\r
+ return true;\r
+ };\r
+\r
+ while ( ( node = walker.previous() ) )\r
+ { /*jsl:pass*/ }\r
+\r
+ assertNodesList( [ '<p>', ' test', '<b>', '<i>', 'simple', 'a ', 'This is ' ], nodes );\r
+ },\r
+ /**\r
+ * Test walker stop at empty endContainer.\r
+ */\r
+ test_stopGuard : function()\r
+ {\r
+ var node = doc.getById( 'playground' );\r
+ node.setHtml( '<span></span>afterEnd' );\r
+ var endContainer = node.getFirst();\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( node );\r
+ range.setEndAt( endContainer, CKEDITOR.POSITION_AFTER_START );\r
+\r
+ var walker = new CKEDITOR.dom.walker( range );\r
+ var nodes = [];\r
+\r
+ walker.evaluator = function( node )\r
+ {\r
+ nodes.push( node );\r
+ return true;\r
+ };\r
+\r
+ while ( ( node = walker.next() ) )\r
+ { /*jsl:pass*/ }\r
+\r
+ assertNodesList( [ '<span>' ], nodes );\r
+\r
+ },\r
+ name : document.title\r
+ };\r
+})() );\r
+\r
+//window.onload = tc.test_stopGuard;\r
+ //]]>\r
+ </script>\r
+</head>\r
+<body>\r
+ <div id="playground"></div>\r
+</body>\r
+</html>\r