--- /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>Plugin: domiterator</title>\r
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\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
+\r
+CKEDITOR.plugins.load( [ 'htmldataprocessor', 'htmlwriter', 'domiterator'] );\r
+\r
+\r
+ </script>\r
+ <script type="text/javascript">\r
+ //<![CDATA[\r
+\r
+/**\r
+ * IE always returning CRLF for linefeed, so remove it when retrieve pre-formated text from text area.\r
+ * @param {Object} id\r
+ */\r
+function getTextAreaValue( id )\r
+{\r
+ return CKEDITOR.document.getById( id ).getValue().replace(/\r/gi,'');\r
+}\r
+\r
+CKEDITOR.test.addTestCase( (function()\r
+{\r
+\r
+ // Local references.\r
+ var assert = CKEDITOR.test.assert,\r
+ arrayAssert = YAHOO.util.ArrayAssert;\r
+\r
+ var doc = new CKEDITOR.dom.document( document );\r
+\r
+ // In these tests, we may "reset" the writer rules to avoid it formatting\r
+ // the output, making the assertion easier to the done. We don't need to\r
+ // test formatting features here, so this is ok.\r
+ var getDataProcessor = function()\r
+ {\r
+ var dataProcessor = new CKEDITOR.htmlDataProcessor();\r
+ dataProcessor.writer._.rules = [];\r
+ return dataProcessor;\r
+ };\r
+\r
+ /**\r
+ * IE always returning CRLF for line-feed, so remove it when retrieving\r
+ * pre-formated text from text area.\r
+ */\r
+ function getTextAreaValue( id )\r
+ {\r
+ return CKEDITOR.document.getById( id ).getValue().replace( /\r/gi, '' );\r
+ }\r
+\r
+ function assumeElementContentAreSame( container, textareaId )\r
+ {\r
+ if( typeof container == 'string' )\r
+ container = doc.getById( container );\r
+ //Assume result document content\r
+ var html = getDataProcessor().toDataFormat( container.getHtml() );\r
+ assert.areSame( getTextAreaValue( textareaId ) , html );\r
+ }\r
+\r
+ function assumeElementAreSame( element, textareaId )\r
+ {\r
+ if( typeof element == 'string' )\r
+ element = doc.getById( element );\r
+ //Assume result document content\r
+ var html = getDataProcessor().toDataFormat( element.getOuterHtml() );\r
+ assert.areSame( getTextAreaValue( textareaId ) , html );\r
+ }\r
+\r
+ /**\r
+ *\r
+ * @param {String|CKEDITOR.dom.range} containerId|range Either the id of html container which contents are treated as range, or a exisiting range object.\r
+ * @param {Object} iteratorOption\r
+ * @param {Array} expectedTagList block elements tagName list in iteration orders.\r
+ */\r
+ function assumeIterationSameAs( containerIdOrRange, iteratorOption, expectedTagList )\r
+ {\r
+ var range;\r
+ if( typeof containerIdOrRange == 'string' )\r
+ {\r
+ range = new CKEDITOR.dom.range( doc );\r
+ range.selectNodeContents( doc.getById( containerIdOrRange ) );\r
+ }\r
+ else\r
+ range = containerIdOrRange;\r
+\r
+ var iter = range.createIterator();\r
+ CKEDITOR.tools.extend( iter, iteratorOption, true );\r
+ var blockList = [], block;\r
+ while (( block = iter.getNextParagraph() ) )\r
+ {\r
+ blockList.push( block.getName() );\r
+ }\r
+ arrayAssert.itemsAreEqual( expectedTagList, blockList );\r
+ }\r
+\r
+ return {\r
+\r
+ /**\r
+ * Test iterating over table cells.\r
+ */\r
+ test_iterator_table_cells : function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( doc.getById( 'iterTarget2a' ), CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt( doc.getById( 'iterTarget2b' ), CKEDITOR.POSITION_BEFORE_END );\r
+ assumeIterationSameAs( range, null, [ 'th', 'p', 'td' ]);\r
+ assumeElementContentAreSame( 'iterContainer2', 'iterResult2' );\r
+ },\r
+\r
+ /**\r
+ * Test iterating over list items.\r
+ */\r
+ test_iterator_listItems : function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( doc.getById( 'iterTarget3a' ), CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt( doc.getById( 'iterTarget3b' ), CKEDITOR.POSITION_BEFORE_END );\r
+ assumeIterationSameAs( range, null, [ 'li', 'p', 'li' ,'p', 'li' ]);\r
+ assumeElementContentAreSame( 'iterContainer3', 'iterResult3' );\r
+ },\r
+\r
+ /**\r
+ * Test iterating over pseudo block.\r
+ */\r
+ test_iterator_pseudoBlock : function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( doc.getById( 'iterTarget4a' ), CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt( doc.getById( 'iterTarget4b' ), CKEDITOR.POSITION_BEFORE_END );\r
+ assumeIterationSameAs( range, null, [ 'p', 'p' ] );\r
+ assumeElementContentAreSame( 'iterContainer4', 'iterResult4' );\r
+ },\r
+\r
+ /**\r
+ * Test collapsed range before paraghraph end.\r
+ */\r
+ test_iterator_collapsed_before_paragraph : function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt( doc.getById( 'iterTarget7' ), CKEDITOR.POSITION_BEFORE_END );\r
+ assumeIterationSameAs( range, null, [ 'p' ]);\r
+ assumeElementContentAreSame( 'iterContainer7', 'iterResult7' );\r
+ },\r
+\r
+ /**\r
+ * Test range collapsed inside paraghraph.\r
+ */\r
+ test_iterator_collapsed_inside_paragraph : function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStart( doc.getById( 'para8' ).getFirst(), 3 );\r
+ assumeIterationSameAs( range, null, [ 'p' ]);\r
+ assumeElementContentAreSame( 'iterContainer8', 'iterResult8' );\r
+ },\r
+\r
+ /**\r
+ * Test fix paragraph-less content.\r
+ */\r
+ test_iterator_establish_paragraph: function()\r
+ {\r
+ var range = new CKEDITOR.dom.range(doc);\r
+ range.setStartAt(doc.getById('iterTarget9'), CKEDITOR.POSITION_AFTER_START);\r
+ range.setEndAt(doc.getById('iterTarget9'), CKEDITOR.POSITION_BEFORE_END);\r
+ assumeIterationSameAs(range, null, ['p']);\r
+ assumeElementContentAreSame( 'iterContainer9', 'iterResult9');\r
+ },\r
+\r
+ /**\r
+ * Test iterating over more than one paragraphs. (#3352)\r
+ */\r
+ test_iterator_multiple_paragraphs: function()\r
+ {\r
+ var range = new CKEDITOR.dom.range( doc );\r
+ range.setStartAt(doc.getById( 'iterTarget10a' ), CKEDITOR.POSITION_AFTER_START );\r
+ range.setEndAt(doc.getById( 'iterTarget10b' ), CKEDITOR.POSITION_BEFORE_END );\r
+ assumeIterationSameAs( range, null, [ 'p', 'p' ] );\r
+ },\r
+\r
+ name : document.title\r
+ };\r
+})() );\r
+\r
+ //]]>\r
+ </script>\r
+</head>\r
+<body>\r
+\r
+\r
+<div id="iterContainer2"><table summary="summary">\r
+ <caption>caption</caption>\r
+ <tr>\r
+ <th id="iterTarget2a">\r
+ head1</th>\r
+ </tr>\r
+ <tr>\r
+ <td><p>cell1</p></td>\r
+ </tr>\r
+ <tr>\r
+ <td id="iterTarget2b">cell2</td>\r
+ </tr>\r
+</table></div>\r
+<textarea id="iterResult2"><table summary="summary"><caption>caption</caption><tbody><tr><th id="iterTarget2a">head1</th></tr><tr><td><p>cell1</p></td></tr><tr><td id="iterTarget2b">cell2</td></tr></tbody></table></textarea>\r
+\r
+<div id="iterContainer3"><ul>\r
+ <li id="iterTarget3a">item1</li>\r
+ <li><p>item2</p></li>\r
+ <li>\r
+ <ul><li>item3</li></ul>\r
+ <ul><li><p>item5</p></li></ul>\r
+ </li>\r
+ <li id="iterTarget3b">item5</li>\r
+ </ul></div>\r
+<textarea id="iterResult3"><ul><li id="iterTarget3a">item1</li><li><p>item2</p></li><li><ul><li>item3</li></ul><ul><li><p>item5</p></li></ul></li><li id="iterTarget3b">item5</li></ul></textarea>\r
+\r
+<div id="iterContainer4">\r
+ <div id="iterTarget4b"><p id="iterTarget4a">paragraph</p>text</div>\r
+</div>\r
+<textarea id="iterResult4"><div id="iterTarget4b"><p id="iterTarget4a">paragraph</p><p>text</p></div></textarea>\r
+\r
+<div id="iterContainer7"><p id="iterTarget7">paragraph</p></div>\r
+<textarea id="iterResult7"><p id="iterTarget7">paragraph</p></textarea>\r
+\r
+<div id="iterContainer8"><p id="para8">paragraph</p></div>\r
+<textarea id="iterResult8"><p id="para8">paragraph</p></textarea>\r
+\r
+<form id="iterContainer9"><span id="iterTarget9">non-paragraph</span></form>\r
+<textarea id="iterResult9"><p><span id="iterTarget9">non-paragraph</span></p></textarea>\r
+\r
+<div id="iterContainer10"><p id="iterTarget10a">para1</p><p id="iterTarget10b">para2</p></div>\r
+\r
+</body>\r
+</html>\r