r102651 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r102650‎ | r102651 | r102652 >
Date:13:15, 10 November 2011
Author:catrope
Status:deferred
Tags:
Comment:
Add globalRange property to the output of selectNodes(), which translates the range property to be relative to the root rather than to the node. Update tests for this, and fix the test case numbering for selectNodes
Modified paths:
  • /trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js (modified) (history)
  • /trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js (modified) (history)

Diff [purge]

Index: trunk/extensions/VisualEditor/tests/es/es.DocumentNode.test.js
@@ -174,21 +174,21 @@
175175 {
176176 'node': root2,
177177 'input': new es.Range( 0, 1 ),
178 - 'output': [{ 'node': f, 'range': new es.Range( 0, 0 ) }],
 178+ 'output': [{ 'node': f, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 1, 1 ) }],
179179 'desc': 'Range starting before the beginning of a node and ending at the beginning'
180180 },
181181 // Test 3
182182 {
183183 'node': root2,
184184 'input': new es.Range( 10, 15 ),
185 - 'output': [{ 'node': g, 'range': new es.Range( 0, 4 ) }],
 185+ 'output': [{ 'node': g, 'range': new es.Range( 0, 4 ), 'globalRange': new es.Range( 11, 15 ) }],
186186 'desc': 'Range starting before the beginning of a node and ending in the middle'
187187 },
188188 // Test 4
189189 {
190190 'node': root2,
191191 'input': new es.Range( 20, 29 ),
192 - 'output': [{ 'node': h, 'range': new es.Range( 0, 8 ) }],
 192+ 'output': [{ 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }],
193193 'desc': 'Range starting before the beginning of a node and ending at the end'
194194 },
195195 // Test 5
@@ -202,70 +202,70 @@
203203 {
204204 'node': root2,
205205 'input': new es.Range( 11, 11 ),
206 - 'output': [{ 'node': g, 'range': new es.Range( 0, 0 ) }],
 206+ 'output': [{ 'node': g, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 11, 11 ) }],
207207 'desc': 'Zero-length range at the beginning of a node'
208208 },
209209 // Test 7
210210 {
211211 'node': root2,
212212 'input': new es.Range( 21, 26 ),
213 - 'output': [{ 'node': h, 'range': new es.Range( 0, 5 ) }],
 213+ 'output': [{ 'node': h, 'range': new es.Range( 0, 5 ), 'globalRange': new es.Range( 21, 26 ) }],
214214 'desc': 'Range starting at the beginning of a node and ending in the middle'
215215 },
216216 // Test 8
217217 {
218218 'node': root2,
219219 'input': new es.Range( 1, 9 ),
220 - 'output': [{ 'node': f, 'range': new es.Range( 0, 8 ) }],
 220+ 'output': [{ 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) }],
221221 'desc': 'Range starting at the beginning of a node and ending at the end'
222222 },
223223 // Test 9
224224 {
225225 'node': root2,
226226 'input': new es.Range( 11, 20 ),
227 - 'output': [{ 'node': g, 'range': new es.Range( 0, 8 ) }],
 227+ 'output': [{ 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) }],
228228 'desc': 'Range starting at the beginning of a node and ending past the end'
229229 },
230230 // Test 10
231231 {
232232 'node': root2,
233233 'input': new es.Range( 22, 22 ),
234 - 'output': [{ 'node': h, 'range': new es.Range( 1, 1 ) }],
 234+ 'output': [{ 'node': h, 'range': new es.Range( 1, 1 ), 'globalRange': new es.Range( 22, 22 ) }],
235235 'desc': 'Zero-length range in the middle of a node'
236236 },
237237 // Test 11
238238 {
239239 'node': root2,
240240 'input': new es.Range( 2, 7 ),
241 - 'output': [{ 'node': f, 'range': new es.Range( 1, 6 ) }],
 241+ 'output': [{ 'node': f, 'range': new es.Range( 1, 6 ), 'globalRange': new es.Range( 2, 7 ) }],
242242 'desc': 'Range starting and ending in the middle of the same node'
243243 },
244244 // Test 12
245245 {
246246 'node': root2,
247247 'input': new es.Range( 13, 19 ),
248 - 'output': [{ 'node': g, 'range': new es.Range( 2, 8 ) }],
 248+ 'output': [{ 'node': g, 'range': new es.Range( 2, 8 ), 'globalRange': new es.Range( 13, 19 ) }],
249249 'desc': 'Range starting in the middle of a node and ending at the end'
250250 },
251251 // Test 13
252252 {
253253 'node': root2,
254254 'input': new es.Range( 24, 30 ),
255 - 'output': [{ 'node': h, 'range': new es.Range( 3, 8 ) }],
 255+ 'output': [{ 'node': h, 'range': new es.Range( 3, 8 ), 'globalRange': new es.Range( 24, 29 ) }],
256256 'desc': 'Range starting in the middle of a node and ending past the end'
257257 },
258258 // Test 14
259259 {
260260 'node': root2,
261261 'input': new es.Range( 9, 9 ),
262 - 'output': [{ 'node': f, 'range': new es.Range( 8, 8 ) }],
 262+ 'output': [{ 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) }],
263263 'desc': 'Zero-length range at the end of a node'
264264 },
265265 // Test 15
266266 {
267267 'node': root2,
268268 'input': new es.Range( 19, 20 ),
269 - 'output': [{ 'node': g, 'range': new es.Range( 8, 8 ) }],
 269+ 'output': [{ 'node': g, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 19, 19 ) }],
270270 'desc': 'Range starting at the end of a node and ending past the end'
271271 },
272272 // Test 16
@@ -291,7 +291,7 @@
292292 'input': new es.Range( 0, 11 ),
293293 'output': [
294294 { 'node': f },
295 - { 'node': g, 'range': new es.Range( 0, 0 ) }
 295+ { 'node': g, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 11, 11 ) }
296296 ],
297297 'desc': 'Range starting before the beginning of the first node and ending at the beginning of the second node'
298298 },
@@ -301,7 +301,7 @@
302302 'input': new es.Range( 0, 14 ),
303303 'output': [
304304 { 'node': f },
305 - { 'node': g, 'range': new es.Range( 0, 3 ) }
 305+ { 'node': g, 'range': new es.Range( 0, 3 ), 'globalRange': new es.Range( 11, 14 ) }
306306 ],
307307 'desc': 'Range starting before the beginning of the first node and ending in the middle of the second node'
308308 },
@@ -311,7 +311,7 @@
312312 'input': new es.Range( 0, 19 ),
313313 'output': [
314314 { 'node': f },
315 - { 'node': g, 'range': new es.Range( 0, 8 ) }
 315+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) }
316316 ],
317317 'desc': 'Range starting before the beginning of the first node and ending at the end of the second node'
318318 },
@@ -332,7 +332,7 @@
333333 'output': [
334334 { 'node': f },
335335 { 'node': g },
336 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 336+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
337337 ],
338338 'desc': 'Range starting before the beginning of the first node and ending at the beginning of the third node'
339339 },
@@ -343,7 +343,7 @@
344344 'output': [
345345 { 'node': f },
346346 { 'node': g },
347 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 347+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
348348 ],
349349 'desc': 'Range starting before the beginning of the first node and ending in the middle of the third node'
350350 },
@@ -354,7 +354,7 @@
355355 'output': [
356356 { 'node': f },
357357 { 'node': g },
358 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 358+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
359359 ],
360360 'desc': 'Range starting before the beginning of the first node and ending at the end of the third node'
361361 },
@@ -374,8 +374,8 @@
375375 'node': root2,
376376 'input': new es.Range( 1, 11 ),
377377 'output': [
378 - { 'node': f, 'range': new es.Range( 0, 8 ) },
379 - { 'node': g, 'range': new es.Range( 0, 0 ) }
 378+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
 379+ { 'node': g, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 11, 11 ) }
380380 ],
381381 'desc': 'Range starting at the beginning of the first node and ending at the beginning of the second node'
382382 },
@@ -384,8 +384,8 @@
385385 'node': root2,
386386 'input': new es.Range( 1, 14 ),
387387 'output': [
388 - { 'node': f, 'range': new es.Range( 0, 8 ) },
389 - { 'node': g, 'range': new es.Range( 0, 3 ) }
 388+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
 389+ { 'node': g, 'range': new es.Range( 0, 3 ), 'globalRange': new es.Range( 11, 14 ) }
390390 ],
391391 'desc': 'Range starting at the beginning of the first node and ending in the middle of the second node'
392392 },
@@ -394,8 +394,8 @@
395395 'node': root2,
396396 'input': new es.Range( 1, 19 ),
397397 'output': [
398 - { 'node': f, 'range': new es.Range( 0, 8 ) },
399 - { 'node': g, 'range': new es.Range( 0, 8 ) }
 398+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
 399+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) }
400400 ],
401401 'desc': 'Range starting at the beginning of the first node and ending at the end of the second node'
402402 },
@@ -404,7 +404,7 @@
405405 'node': root2,
406406 'input': new es.Range( 1, 20 ),
407407 'output': [
408 - { 'node': f, 'range': new es.Range( 0, 8 ) },
 408+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
409409 { 'node': g }
410410 ],
411411 'desc': 'Range starting at the beginning of the first node and ending between the second and the third node'
@@ -414,9 +414,9 @@
415415 'node': root2,
416416 'input': new es.Range( 1, 21 ),
417417 'output': [
418 - { 'node': f, 'range': new es.Range( 0, 8 ) },
 418+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
419419 { 'node': g },
420 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 420+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
421421 ],
422422 'desc': 'Range starting at the beginning of the first node and ending at the beginning of the third node'
423423 },
@@ -425,9 +425,9 @@
426426 'node': root2,
427427 'input': new es.Range( 1, 27 ),
428428 'output': [
429 - { 'node': f, 'range': new es.Range( 0, 8 ) },
 429+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
430430 { 'node': g },
431 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 431+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
432432 ],
433433 'desc': 'Range starting at the beginning of the first node and ending in the middle of the third node'
434434 },
@@ -436,9 +436,9 @@
437437 'node': root2,
438438 'input': new es.Range( 1, 29 ),
439439 'output': [
440 - { 'node': f, 'range': new es.Range( 0, 8 ) },
 440+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
441441 { 'node': g },
442 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 442+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
443443 ],
444444 'desc': 'Range starting at the beginning of the first node and ending at the end of the third node'
445445 },
@@ -447,7 +447,7 @@
448448 'node': root2,
449449 'input': new es.Range( 1, 30 ),
450450 'output': [
451 - { 'node': f, 'range': new es.Range( 0, 8 ) },
 451+ { 'node': f, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 1, 9 ) },
452452 { 'node': g },
453453 { 'node': h }
454454 ],
@@ -458,8 +458,8 @@
459459 'node': root2,
460460 'input': new es.Range( 5, 11 ),
461461 'output': [
462 - { 'node': f, 'range': new es.Range( 4, 8 ) },
463 - { 'node': g, 'range': new es.Range( 0, 0 ) }
 462+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
 463+ { 'node': g, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 11, 11 ) }
464464 ],
465465 'desc': 'Range starting in the middle of the first node and ending at the beginning of the second node'
466466 },
@@ -468,8 +468,8 @@
469469 'node': root2,
470470 'input': new es.Range( 5, 14 ),
471471 'output': [
472 - { 'node': f, 'range': new es.Range( 4, 8 ) },
473 - { 'node': g, 'range': new es.Range( 0, 3 ) }
 472+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
 473+ { 'node': g, 'range': new es.Range( 0, 3 ), 'globalRange': new es.Range( 11, 14 ) }
474474 ],
475475 'desc': 'Range starting in the middle of the first node and ending in the middle of the second node'
476476 },
@@ -478,8 +478,8 @@
479479 'node': root2,
480480 'input': new es.Range( 5, 19 ),
481481 'output': [
482 - { 'node': f, 'range': new es.Range( 4, 8 ) },
483 - { 'node': g, 'range': new es.Range( 0, 8 ) }
 482+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
 483+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) }
484484 ],
485485 'desc': 'Range starting in the middle of the first node and ending at the end of the second node'
486486 },
@@ -488,7 +488,7 @@
489489 'node': root2,
490490 'input': new es.Range( 5, 20 ),
491491 'output': [
492 - { 'node': f, 'range': new es.Range( 4, 8 ) },
 492+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
493493 { 'node': g }
494494 ],
495495 'desc': 'Range starting in the middle of the first node and ending between the second and the third node'
@@ -498,9 +498,9 @@
499499 'node': root2,
500500 'input': new es.Range( 5, 21 ),
501501 'output': [
502 - { 'node': f, 'range': new es.Range( 4, 8 ) },
 502+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
503503 { 'node': g },
504 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 504+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
505505 ],
506506 'desc': 'Range starting in the middle of the first node and ending at the beginning of the third node'
507507 },
@@ -509,9 +509,9 @@
510510 'node': root2,
511511 'input': new es.Range( 5, 27 ),
512512 'output': [
513 - { 'node': f, 'range': new es.Range( 4, 8 ) },
 513+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
514514 { 'node': g },
515 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 515+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
516516 ],
517517 'desc': 'Range starting in the middle of the first node and ending in the middle of the third node'
518518 },
@@ -520,9 +520,9 @@
521521 'node': root2,
522522 'input': new es.Range( 5, 29 ),
523523 'output': [
524 - { 'node': f, 'range': new es.Range( 4, 8 ) },
 524+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
525525 { 'node': g },
526 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 526+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
527527 ],
528528 'desc': 'Range starting in the middle of the first node and ending at the end of the third node'
529529 },
@@ -531,7 +531,7 @@
532532 'node': root2,
533533 'input': new es.Range( 5, 30 ),
534534 'output': [
535 - { 'node': f, 'range': new es.Range( 4, 8 ) },
 535+ { 'node': f, 'range': new es.Range( 4, 8 ), 'globalRange': new es.Range( 5, 9 ) },
536536 { 'node': g },
537537 { 'node': h }
538538 ],
@@ -542,8 +542,8 @@
543543 'node': root2,
544544 'input': new es.Range( 9, 11 ),
545545 'output': [
546 - { 'node': f, 'range': new es.Range( 8, 8 ) },
547 - { 'node': g, 'range': new es.Range( 0, 0 ) }
 546+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
 547+ { 'node': g, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 11, 11 ) }
548548 ],
549549 'desc': 'Range starting at the end of the first node and ending at the beginning of the second node'
550550 },
@@ -552,8 +552,8 @@
553553 'node': root2,
554554 'input': new es.Range( 9, 14 ),
555555 'output': [
556 - { 'node': f, 'range': new es.Range( 8, 8 ) },
557 - { 'node': g, 'range': new es.Range( 0, 3 ) }
 556+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
 557+ { 'node': g, 'range': new es.Range( 0, 3 ), 'globalRange': new es.Range( 11, 14 ) }
558558 ],
559559 'desc': 'Range starting at the end of the first node and ending in the middle of the second node'
560560 },
@@ -562,8 +562,8 @@
563563 'node': root2,
564564 'input': new es.Range( 9, 19 ),
565565 'output': [
566 - { 'node': f, 'range': new es.Range( 8, 8 ) },
567 - { 'node': g, 'range': new es.Range( 0, 8 ) }
 566+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
 567+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) }
568568 ],
569569 'desc': 'Range starting at the end of the first node and ending at the end of the second node'
570570 },
@@ -572,7 +572,7 @@
573573 'node': root2,
574574 'input': new es.Range( 9, 20 ),
575575 'output': [
576 - { 'node': f, 'range': new es.Range( 8, 8 ) },
 576+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
577577 { 'node': g }
578578 ],
579579 'desc': 'Range starting at the end of the first node and ending between the second and the third node'
@@ -582,9 +582,9 @@
583583 'node': root2,
584584 'input': new es.Range( 9, 21 ),
585585 'output': [
586 - { 'node': f, 'range': new es.Range( 8, 8 ) },
 586+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
587587 { 'node': g },
588 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 588+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
589589 ],
590590 'desc': 'Range starting at the end of the first node and ending at the beginning of the third node'
591591 },
@@ -593,9 +593,9 @@
594594 'node': root2,
595595 'input': new es.Range( 9, 27 ),
596596 'output': [
597 - { 'node': f, 'range': new es.Range( 8, 8 ) },
 597+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
598598 { 'node': g },
599 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 599+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
600600 ],
601601 'desc': 'Range starting at the end of the first node and ending in the middle of the third node'
602602 },
@@ -604,9 +604,9 @@
605605 'node': root2,
606606 'input': new es.Range( 9, 29 ),
607607 'output': [
608 - { 'node': f, 'range': new es.Range( 8, 8 ) },
 608+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
609609 { 'node': g },
610 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 610+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
611611 ],
612612 'desc': 'Range starting at the end of the first node and ending at the end of the third node'
613613 },
@@ -615,7 +615,7 @@
616616 'node': root2,
617617 'input': new es.Range( 9, 30 ),
618618 'output': [
619 - { 'node': f, 'range': new es.Range( 8, 8 ) },
 619+ { 'node': f, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 9, 9 ) },
620620 { 'node': g },
621621 { 'node': h }
622622 ],
@@ -627,7 +627,7 @@
628628 'input': new es.Range( 10, 21 ),
629629 'output': [
630630 { 'node': g },
631 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 631+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
632632 ],
633633 'desc': 'Range starting between the first and the second node and ending at the beginning of the third node'
634634 },
@@ -637,21 +637,21 @@
638638 'input': new es.Range( 10, 27 ),
639639 'output': [
640640 { 'node': g },
641 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 641+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
642642 ],
643643 'desc': 'Range starting between the first and the second node and ending in the middle of the third node'
644644 },
645 - // Test 56
 645+ // Test 52
646646 {
647647 'node': root2,
648648 'input': new es.Range( 10, 29 ),
649649 'output': [
650650 { 'node': g },
651 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 651+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
652652 ],
653653 'desc': 'Range starting between the first and the second node and ending at the end of the third node'
654654 },
655 - // Test 57
 655+ // Test 53
656656 {
657657 'node': root2,
658658 'input': new es.Range( 10, 30 ),
@@ -661,170 +661,170 @@
662662 ],
663663 'desc': 'Range starting between the first and the second node and ending past the end of the third node'
664664 },
665 - // Test 58
 665+ // Test 54
666666 {
667667 'node': root2,
668668 'input': new es.Range( 11, 21 ),
669669 'output': [
670 - { 'node': g, 'range': new es.Range( 0, 8 ) },
671 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 670+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) },
 671+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
672672 ],
673673 'desc': 'Range starting at the beginning of the second node and ending at the beginning of the third node'
674674 },
675 - // Test 59
 675+ // Test 55
676676 {
677677 'node': root2,
678678 'input': new es.Range( 11, 27 ),
679679 'output': [
680 - { 'node': g, 'range': new es.Range( 0, 8 ) },
681 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 680+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) },
 681+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
682682 ],
683683 'desc': 'Range starting at the beginning of the second node and ending in the middle of the third node'
684684 },
685 - // Test 60
 685+ // Test 56
686686 {
687687 'node': root2,
688688 'input': new es.Range( 11, 29 ),
689689 'output': [
690 - { 'node': g, 'range': new es.Range( 0, 8 ) },
691 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 690+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) },
 691+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
692692 ],
693693 'desc': 'Range starting at the beginning of the second node and ending at the end of the third node'
694694 },
695 - // Test 61
 695+ // Test 57
696696 {
697697 'node': root2,
698698 'input': new es.Range( 11, 30 ),
699699 'output': [
700 - { 'node': g, 'range': new es.Range( 0, 8 ) },
 700+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 11, 19 ) },
701701 { 'node': h }
702702 ],
703703 'desc': 'Range starting at the beginning of the second node and ending past the end of the third node'
704704 },
705 - // Test 62
 705+ // Test 58
706706 {
707707 'node': root2,
708708 'input': new es.Range( 14, 21 ),
709709 'output': [
710 - { 'node': g, 'range': new es.Range( 3, 8 ) },
711 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 710+ { 'node': g, 'range': new es.Range( 3, 8 ), 'globalRange': new es.Range( 14, 19 ) },
 711+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
712712 ],
713713 'desc': 'Range starting in the middle of the second node and ending at the beginning of the third node'
714714 },
715 - // Test 63
 715+ // Test 59
716716 {
717717 'node': root2,
718718 'input': new es.Range( 14, 27 ),
719719 'output': [
720 - { 'node': g, 'range': new es.Range( 3, 8 ) },
721 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 720+ { 'node': g, 'range': new es.Range( 3, 8 ), 'globalRange': new es.Range( 14, 19 ) },
 721+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
722722 ],
723723 'desc': 'Range starting in the middle of the second node and ending in the middle of the third node'
724724 },
725 - // Test 64
 725+ // Test 60
726726 {
727727 'node': root2,
728728 'input': new es.Range( 14, 29 ),
729729 'output': [
730 - { 'node': g, 'range': new es.Range( 3, 8 ) },
731 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 730+ { 'node': g, 'range': new es.Range( 3, 8 ), 'globalRange': new es.Range( 14, 19 ) },
 731+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
732732 ],
733733 'desc': 'Range starting in the middle of the second node and ending at the end of the third node'
734734 },
735 - // Test 65
 735+ // Test 61
736736 {
737737 'node': root2,
738738 'input': new es.Range( 14, 30 ),
739739 'output': [
740 - { 'node': g, 'range': new es.Range( 3, 8 ) },
 740+ { 'node': g, 'range': new es.Range( 3, 8 ), 'globalRange': new es.Range( 14, 19 ) },
741741 { 'node': h }
742742 ],
743743 'desc': 'Range starting in the middle of the second node and ending past the end of the third node'
744744 },
745 - // Test 66
 745+ // Test 62
746746 {
747747 'node': root2,
748748 'input': new es.Range( 19, 21 ),
749749 'output': [
750 - { 'node': g, 'range': new es.Range( 8, 8 ) },
751 - { 'node': h, 'range': new es.Range( 0, 0 ) }
 750+ { 'node': g, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 19, 19 ) },
 751+ { 'node': h, 'range': new es.Range( 0, 0 ), 'globalRange': new es.Range( 21, 21 ) }
752752 ],
753753 'desc': 'Range starting at the end of the second node and ending at the beginning of the third node'
754754 },
755 - // Test 67
 755+ // Test 63
756756 {
757757 'node': root2,
758758 'input': new es.Range( 19, 27 ),
759759 'output': [
760 - { 'node': g, 'range': new es.Range( 8, 8 ) },
761 - { 'node': h, 'range': new es.Range( 0, 6 ) }
 760+ { 'node': g, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 19, 19 ) },
 761+ { 'node': h, 'range': new es.Range( 0, 6 ), 'globalRange': new es.Range( 21, 27 ) }
762762 ],
763763 'desc': 'Range starting at the end of the second node and ending in the middle of the third node'
764764 },
765 - // Test 68
 765+ // Test 64
766766 {
767767 'node': root2,
768768 'input': new es.Range( 19, 29 ),
769769 'output': [
770 - { 'node': g, 'range': new es.Range( 8, 8 ) },
771 - { 'node': h, 'range': new es.Range( 0, 8 ) }
 770+ { 'node': g, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 19, 19 ) },
 771+ { 'node': h, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 21, 29 ) }
772772 ],
773773 'desc': 'Range starting at the end of the second node and ending at the end of the third node'
774774 },
775 - // Test 69
 775+ // Test 65
776776 {
777777 'node': root2,
778778 'input': new es.Range( 19, 30 ),
779779 'output': [
780 - { 'node': g, 'range': new es.Range( 8, 8 ) },
 780+ { 'node': g, 'range': new es.Range( 8, 8 ), 'globalRange': new es.Range( 19, 19 ) },
781781 { 'node': h }
782782 ],
783783 'desc': 'Range starting at the end of the second node and ending past the end of the third node'
784784 },
785785 // Tests for childless nodes
786786
787 - // Test 70
 787+ // Test 66
788788 {
789789 'node': g,
790790 'input': new es.Range( 1, 3 ),
791791 'output': [
792 - { 'node': g, 'range': new es.Range( 1, 3 ) }
 792+ { 'node': g, 'range': new es.Range( 1, 3 ), 'globalRange': new es.Range( 1, 3 ) }
793793 ],
794794 'desc': 'Childless node given, range not out of bounds'
795795 },
796 - // Test 72
 796+ // Test 67
797797 {
798798 'node': g,
799799 'input': new es.Range( 0, 8 ),
800800 'output': [
801 - { 'node': g, 'range': new es.Range( 0, 8 ) }
 801+ { 'node': g, 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 0, 8 ) }
802802 ],
803803 'desc': 'Childless node given, range covers entire node'
804804 },
805805 // Tests for out-of-bounds cases
806806
807 - // Test 73
 807+ // Test 68
808808 {
809809 'node': g,
810810 'input': new es.Range( -1, 3 ),
811811 'exception': /^The start offset of the range is negative$/,
812812 'desc': 'Childless node given, range start out of bounds'
813813 },
814 - // Test 74
 814+ // Test 69
815815 {
816816 'node': g,
817817 'input': new es.Range( 1, 9 ),
818818 'exception': /^The end offset of the range is past the end of the node$/,
819819 'desc': 'Childless node given, range end out of bounds'
820820 },
821 - // Test 75
 821+ // Test 70
822822 {
823823 'node': root2,
824824 'input': new es.Range( 31, 35 ),
825825 'exception': /^The start offset of the range is past the end of the node$/,
826826 'desc': 'Node with children given, range start out of bounds'
827827 },
828 - // Test 76
 828+ // Test 71
829829 {
830830 'node': root2,
831831 'input': new es.Range( 30, 35 ),
@@ -833,44 +833,44 @@
834834 },
835835 // Tests for recursion cases
836836
837 - // Test 77
 837+ // Test 72
838838 {
839839 'node': big,
840840 'input': new es.Range( 2, 10 ),
841841 'output': [
842 - { 'node': big.children[0], 'range': new es.Range( 1, 3 ) },
843 - { 'node': big.children[1], 'range': new es.Range( 0, 4 ) }
 842+ { 'node': big.children[0], 'range': new es.Range( 1, 3 ), 'globalRange': new es.Range( 2, 4 ) },
 843+ { 'node': big.children[1], 'range': new es.Range( 0, 4 ), 'globalRange': new es.Range( 6, 10 ) }
844844 ],
845845 'desc': 'Select from before the b to after the d'
846846 },
847 - // Test 78
 847+ // Test 73
848848 {
849849 'node': big,
850 - 'input': new es.Range( 3, 29 ),
 850+ 'input': new es.Range( 3, 33 ),
851851 'output': [
852 - { 'node': big.children[0], 'range': new es.Range( 2, 8 ) },
 852+ { 'node': big.children[0], 'range': new es.Range( 2, 3 ), 'globalRange': new es.Range( 3, 4 ) },
853853 { 'node': big.children[1] },
854 - { 'node': big.children[2], 'range': new es.Range( 0, 8 ) }
 854+ { 'node': big.children[2], 'range': new es.Range( 0, 1 ), 'globalRange': new es.Range( 32, 33 ) }
855855 ],
856856 'desc': 'Select from before the c to after the h'
857857 },
858 - // Test 79
 858+ // Test 74
859859 {
860860 'node': big,
861 - 'input': new es.Range( 9, 17 ),
 861+ 'input': new es.Range( 9, 20 ),
862862 'output': [
863 - { 'node': big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0, 1 ) },
864 - { 'node': big.children[1].children[0].children[0].children[1], 'range': new es.Range( 0, 5 ) }
 863+ { 'node': big.children[1].children[0].children[0].children[0], 'range': new es.Range( 0, 1 ), 'globalRange': new es.Range( 9, 10 ) },
 864+ { 'node': big.children[1].children[0].children[0].children[1], 'range': new es.Range( 0, 8 ), 'globalRange': new es.Range( 12, 20 ) }
865865 ],
866866 'desc': 'Select from before the d to after the f, with recursion'
867867 },
868 - // Test 80
 868+ // Test 75
869869 {
870870 'node': big,
871 - 'input': new es.Range( 9, 17 ),
 871+ 'input': new es.Range( 9, 20 ),
872872 'shallow': true,
873873 'output': [
874 - { 'node': big.children[1], 'range': new es.Range( 3, 11 ) }
 874+ { 'node': big.children[1], 'range': new es.Range( 3, 14 ), 'globalRange': new es.Range( 9, 20 ) }
875875 ],
876876 'desc': 'Select from before the d to after the f, without recursion'
877877 }
@@ -890,6 +890,15 @@
891891 a[i].range.end !== b[i].range.end
892892 )
893893 )
 894+ ) || (
 895+ ( typeof a[i].globalRange !== typeof b[i].globalRange ) ||
 896+ (
 897+ a[i].globalRange !== undefined &&
 898+ (
 899+ a[i].globalRange.start !== b[i].globalRange.start ||
 900+ a[i].globalRange.end !== b[i].globalRange.end
 901+ )
 902+ )
894903 )
895904 ) {
896905 return false;
Index: trunk/extensions/VisualEditor/modules/es/bases/es.DocumentBranchNode.js
@@ -138,7 +138,7 @@
139139 * @method
140140 * @param {es.Range} range Range to select nodes within
141141 * @param {Boolean} [shallow] Do not recurse into child nodes of child nodes
142 - * @returns {Array} List of objects with 'node' and 'range' properties describing nodes which are
 142+ * @returns {Array} List of objects with 'node', 'range' and 'globalRange' properties describing nodes which are
143143 * covered by the range and the range within the node that is covered
144144 */
145145 es.DocumentBranchNode.prototype.selectNodes = function( range, shallow ) {
@@ -149,6 +149,7 @@
150150 }
151151 var nodes = [],
152152 i,
 153+ j,
153154 left,
154155 right,
155156 start = range.start,
@@ -166,7 +167,7 @@
167168 if ( end > this.getContentLength() ) {
168169 throw 'The end offset of the range is past the end of the node';
169170 }
170 - return [{ 'node': this, 'range': new es.Range( start, end ) }];
 171+ return [{ 'node': this, 'range': new es.Range( start, end ), 'globalRange': new es.Range( start, end ) }];
171172 }
172173
173174 // This node has children, loop over them
@@ -187,11 +188,21 @@
188189 // The range is entirely inside this.children[i]
189190 if ( shallow ) {
190191 nodes = [
191 - { 'node': this.children[i], 'range': new es.Range( start - left, end - left ) }
 192+ {
 193+ 'node': this.children[i],
 194+ 'range': new es.Range( start - left, end - left ),
 195+ 'globalRange': new es.Range( start, end )
 196+ }
192197 ];
193198 } else {
194199 // Recurse into this.children[i]
195200 nodes = this.children[i].selectNodes( new es.Range( start - left, end - left ) );
 201+ // Adjust globalRange
 202+ for ( j = 0; j < nodes.length; j++ ) {
 203+ if ( nodes[j].globalRange !== undefined ) {
 204+ nodes[j].globalRange = es.Range.newFromTranslatedRange( nodes[j].globalRange, left );
 205+ }
 206+ }
196207 }
197208 // Since the start and end are both inside this.children[i], we know for sure that we're
198209 // done, so return
@@ -199,13 +210,19 @@
200211 } else if ( startInside ) {
201212 // The start is inside this.children[i] but the end isn't
202213 // Add a range from the start of the range to the end of this.children[i]
203 - nodes.push(
204 - { 'node': this.children[i], 'range': new es.Range( start - left, right - left ) }
205 - );
 214+ nodes.push( {
 215+ 'node': this.children[i],
 216+ 'range': new es.Range( start - left, right - left ),
 217+ 'globalRange': new es.Range( start, right )
 218+ } );
206219 } else if ( endInside ) {
207220 // The end is inside this.children[i] but the start isn't
208221 // Add a range from the start of this.children[i] to the end of the range
209 - nodes.push( { 'node': this.children[i], 'range': new es.Range( 0, end - left ) } );
 222+ nodes.push( {
 223+ 'node': this.children[i],
 224+ 'range': new es.Range( 0, end - left ),
 225+ 'globalRange': new es.Range( left, end )
 226+ } );
210227 // We've found the end, so we're done
211228 return nodes;
212229 } else if ( end == right + 1 ) {

Status & tagging log