1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
\r
2 <html xmlns="http://www.w3.org/1999/xhtml">
\r
4 <title>Plugin: domiterator</title>
\r
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
\r
6 <link rel="stylesheet" type="text/css" href="../../test.css" />
\r
7 <script type="text/javascript" src="../../../ckeditor.js"></script>
\r
8 <script type="text/javascript" src="../../test.js"></script>
\r
9 <script type="text/javascript">
\r
11 CKEDITOR.plugins.load( [ 'htmldataprocessor', 'htmlwriter', 'domiterator'] );
\r
15 <script type="text/javascript">
\r
19 * IE always returning CRLF for linefeed, so remove it when retrieve pre-formated text from text area.
\r
20 * @param {Object} id
\r
22 function getTextAreaValue( id )
\r
24 return CKEDITOR.document.getById( id ).getValue().replace(/\r/gi,'');
\r
27 CKEDITOR.test.addTestCase( (function()
\r
30 // Local references.
\r
31 var assert = CKEDITOR.test.assert,
\r
32 arrayAssert = YAHOO.util.ArrayAssert;
\r
34 var doc = new CKEDITOR.dom.document( document );
\r
36 // In these tests, we may "reset" the writer rules to avoid it formatting
\r
37 // the output, making the assertion easier to the done. We don't need to
\r
38 // test formatting features here, so this is ok.
\r
39 var getDataProcessor = function()
\r
41 var dataProcessor = new CKEDITOR.htmlDataProcessor();
\r
42 dataProcessor.writer._.rules = [];
\r
43 return dataProcessor;
\r
47 * IE always returning CRLF for line-feed, so remove it when retrieving
\r
48 * pre-formated text from text area.
\r
50 function getTextAreaValue( id )
\r
52 return CKEDITOR.document.getById( id ).getValue().replace( /\r/gi, '' );
\r
55 function assumeElementContentAreSame( container, textareaId )
\r
57 if( typeof container == 'string' )
\r
58 container = doc.getById( container );
\r
59 //Assume result document content
\r
60 var html = getDataProcessor().toDataFormat( container.getHtml() );
\r
61 assert.areSame( getTextAreaValue( textareaId ) , html );
\r
64 function assumeElementAreSame( element, textareaId )
\r
66 if( typeof element == 'string' )
\r
67 element = doc.getById( element );
\r
68 //Assume result document content
\r
69 var html = getDataProcessor().toDataFormat( element.getOuterHtml() );
\r
70 assert.areSame( getTextAreaValue( textareaId ) , html );
\r
75 * @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
76 * @param {Object} iteratorOption
\r
77 * @param {Array} expectedTagList block elements tagName list in iteration orders.
\r
79 function assumeIterationSameAs( containerIdOrRange, iteratorOption, expectedTagList )
\r
82 if( typeof containerIdOrRange == 'string' )
\r
84 range = new CKEDITOR.dom.range( doc );
\r
85 range.selectNodeContents( doc.getById( containerIdOrRange ) );
\r
88 range = containerIdOrRange;
\r
90 var iter = range.createIterator();
\r
91 CKEDITOR.tools.extend( iter, iteratorOption, true );
\r
92 var blockList = [], block;
\r
93 while (( block = iter.getNextParagraph() ) )
\r
95 blockList.push( block.getName() );
\r
97 arrayAssert.itemsAreEqual( expectedTagList, blockList );
\r
103 * Test iterating over table cells.
\r
105 test_iterator_table_cells : function()
\r
107 var range = new CKEDITOR.dom.range( doc );
\r
108 range.setStartAt( doc.getById( 'iterTarget2a' ), CKEDITOR.POSITION_AFTER_START );
\r
109 range.setEndAt( doc.getById( 'iterTarget2b' ), CKEDITOR.POSITION_BEFORE_END );
\r
110 assumeIterationSameAs( range, null, [ 'th', 'p', 'td' ]);
\r
111 assumeElementContentAreSame( 'iterContainer2', 'iterResult2' );
\r
115 * Test iterating over list items.
\r
117 test_iterator_listItems : function()
\r
119 var range = new CKEDITOR.dom.range( doc );
\r
120 range.setStartAt( doc.getById( 'iterTarget3a' ), CKEDITOR.POSITION_AFTER_START );
\r
121 range.setEndAt( doc.getById( 'iterTarget3b' ), CKEDITOR.POSITION_BEFORE_END );
\r
122 assumeIterationSameAs( range, null, [ 'li', 'p', 'li' ,'p', 'li' ]);
\r
123 assumeElementContentAreSame( 'iterContainer3', 'iterResult3' );
\r
127 * Test iterating over pseudo block.
\r
129 test_iterator_pseudoBlock : function()
\r
131 var range = new CKEDITOR.dom.range( doc );
\r
132 range.setStartAt( doc.getById( 'iterTarget4a' ), CKEDITOR.POSITION_AFTER_START );
\r
133 range.setEndAt( doc.getById( 'iterTarget4b' ), CKEDITOR.POSITION_BEFORE_END );
\r
134 assumeIterationSameAs( range, null, [ 'p', 'p' ] );
\r
135 assumeElementContentAreSame( 'iterContainer4', 'iterResult4' );
\r
139 * Test collapsed range before paraghraph end.
\r
141 test_iterator_collapsed_before_paragraph : function()
\r
143 var range = new CKEDITOR.dom.range( doc );
\r
144 range.setStartAt( doc.getById( 'iterTarget7' ), CKEDITOR.POSITION_BEFORE_END );
\r
145 assumeIterationSameAs( range, null, [ 'p' ]);
\r
146 assumeElementContentAreSame( 'iterContainer7', 'iterResult7' );
\r
150 * Test range collapsed inside paraghraph.
\r
152 test_iterator_collapsed_inside_paragraph : function()
\r
154 var range = new CKEDITOR.dom.range( doc );
\r
155 range.setStart( doc.getById( 'para8' ).getFirst(), 3 );
\r
156 assumeIterationSameAs( range, null, [ 'p' ]);
\r
157 assumeElementContentAreSame( 'iterContainer8', 'iterResult8' );
\r
161 * Test fix paragraph-less content.
\r
163 test_iterator_establish_paragraph: function()
\r
165 var range = new CKEDITOR.dom.range(doc);
\r
166 range.setStartAt(doc.getById('iterTarget9'), CKEDITOR.POSITION_AFTER_START);
\r
167 range.setEndAt(doc.getById('iterTarget9'), CKEDITOR.POSITION_BEFORE_END);
\r
168 assumeIterationSameAs(range, null, ['p']);
\r
169 assumeElementContentAreSame( 'iterContainer9', 'iterResult9');
\r
173 * Test iterating over more than one paragraphs. (#3352)
\r
175 test_iterator_multiple_paragraphs: function()
\r
177 var range = new CKEDITOR.dom.range( doc );
\r
178 range.setStartAt(doc.getById( 'iterTarget10a' ), CKEDITOR.POSITION_AFTER_START );
\r
179 range.setEndAt(doc.getById( 'iterTarget10b' ), CKEDITOR.POSITION_BEFORE_END );
\r
180 assumeIterationSameAs( range, null, [ 'p', 'p' ] );
\r
183 name : document.title
\r
193 <div id="iterContainer2"><table summary="summary">
\r
194 <caption>caption</caption>
\r
196 <th id="iterTarget2a">
\r
200 <td><p>cell1</p></td>
\r
203 <td id="iterTarget2b">cell2</td>
\r
206 <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
208 <div id="iterContainer3"><ul>
\r
209 <li id="iterTarget3a">item1</li>
\r
210 <li><p>item2</p></li>
\r
212 <ul><li>item3</li></ul>
\r
213 <ul><li><p>item5</p></li></ul>
\r
215 <li id="iterTarget3b">item5</li>
\r
217 <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
219 <div id="iterContainer4">
\r
220 <div id="iterTarget4b"><p id="iterTarget4a">paragraph</p>text</div>
\r
222 <textarea id="iterResult4"><div id="iterTarget4b"><p id="iterTarget4a">paragraph</p><p>text</p></div></textarea>
\r
224 <div id="iterContainer7"><p id="iterTarget7">paragraph</p></div>
\r
225 <textarea id="iterResult7"><p id="iterTarget7">paragraph</p></textarea>
\r
227 <div id="iterContainer8"><p id="para8">paragraph</p></div>
\r
228 <textarea id="iterResult8"><p id="para8">paragraph</p></textarea>
\r
230 <form id="iterContainer9"><span id="iterTarget9">non-paragraph</span></form>
\r
231 <textarea id="iterResult9"><p><span id="iterTarget9">non-paragraph</span></p></textarea>
\r
233 <div id="iterContainer10"><p id="iterTarget10a">para1</p><p id="iterTarget10b">para2</p></div>
\r