Show
Ignore:
Timestamp:
04/25/07 20:40:05 (3 years ago)
Author:
ydnar
Message:

bugid:49744; hate IE TextRange::compareEndPoints

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/vox-28/common/SelectionRange.js

    r159 r163  
    106106        range2.collapse( true ); 
    107107        var offset = 0; 
     108        var offsets = {}; 
    108109        var steps = 0; 
    109          
    110         // bail after 1k iterations in case of borkage 
    111         while( (test = range2.compareEndPoints( compareType, range )) != 0 ) { 
     110        var broken = false; 
     111         
     112        /* this breaks if the user selects all, where the selection endpoint is at the end of body */ 
     113        /* hence storing previously-visited offsets */ 
     114         
     115        while( test = range2.compareEndPoints( compareType, range ) ) { 
    112116            if( test < 0 ) { 
    113117                range2.move( "character", delta ); 
     
    117121                offset -= delta; 
    118122            } 
     123             
    119124            delta = max( 1, finiteInt( delta * 0.5 ) ); 
     125             
     126            /* visited this offset before? */ 
     127            if( offsets[ offset ] === offset ) { 
     128                broken = true; 
     129                break; 
     130            } 
     131            offsets[ offset ] = offset; 
     132             
     133            /* infinite loop bug */ 
    120134            steps++; 
    121             if( steps > 1000 ) 
    122                 throw "unable to find textrange endpoint in " + steps + " steps"; 
    123         } 
    124          
    125         // this breaks if the user selects all, where the selection endpoint is at the 
    126         // end of body 
    127          
    128         //log( "steps: " + steps ); 
     135            if( steps > 1000 || (offset < 0 || offset > length + 1) ) { 
     136                broken = true; 
     137                break; 
     138            } 
     139        } 
     140         
     141        /* 
     142        if( broken ) 
     143            log( "BROKEN: " + parent.tagName + " " + length + " " + compareType + " " + test + " " + delta + " " + offset ); 
     144        else 
     145            log( "GOOD: " + parent.tagName + " " + offset ); 
     146        */ 
     147         
    129148        return DOM.Proxy.findTextPosition( parent, offset ); 
    130149    },