Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8721

Show
Ignore:
Timestamp:
01/25/08 18:49:40 (8 months ago)
Author:
andrew
Message:

Prevent DOM node expandos _countedByPrototype and _prototypeEventID from being serialized into (inner|outer)HTML in IE. Closes #10909. [dcpedit, Tobie Langel, Andrew Dupont]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • spinoffs/prototype/trunk/CHANGELOG

    r8714 r8721  
    11*SVN* 
     2 
     3* Prevent DOM node expandos _countedByPrototype and _prototypeEventID from being serialized into (inner|outer)HTML in IE. Closes #10909. [dcpedit, Tobie Langel, Andrew Dupont] 
    24 
    35* Make Ajax.Request#isSameOrigin JavaScript Lint compliant. [Andrew Dupont] 
  • spinoffs/prototype/trunk/src/event.js

    r8548 r8721  
    129129Object.extend(Event, (function() { 
    130130  var cache = Event.cache; 
    131    
     131 
    132132  function getEventID(element) { 
    133     if (element._eventID) return element._eventID
     133    if (element._prototypeEventID) return element._prototypeEventID[0]
    134134    arguments.callee.id = arguments.callee.id || 1; 
    135     return element._eventID = ++arguments.callee.id
     135    return element._prototypeEventID = [++arguments.callee.id]
    136136  } 
    137137   
  • spinoffs/prototype/trunk/src/selector.js

    r8709 r8721  
    313313    // marks an array of nodes for counting 
    314314    mark: function(nodes) { 
     315      var _true = Prototype.emptyFunction; 
    315316      for (var i = 0, node; node = nodes[i]; i++) 
    316         node._counted = true; 
     317        node._countedByPrototype = _true; 
    317318      return nodes; 
    318319    }, 
     
    320321    unmark: function(nodes) { 
    321322      for (var i = 0, node; node = nodes[i]; i++) 
    322         node._counted = undefined;     
     323        node._countedByPrototype = undefined;     
    323324      return nodes;   
    324325    }, 
     
    328329    // rather than nth-child 
    329330    index: function(parentNode, reverse, ofType) { 
    330       parentNode._counted = true
     331      parentNode._countedByPrototype = Prototype.emptyFunction
    331332      if (reverse) { 
    332333        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { 
    333334          var node = nodes[i]; 
    334           if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; 
     335          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; 
    335336        } 
    336337      } else { 
    337338        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) 
    338           if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; 
     339          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; 
    339340      } 
    340341    }, 
     
    345346      var results = [], n; 
    346347      for (var i = 0, l = nodes.length; i < l; i++) 
    347         if (!(n = nodes[i])._counted) { 
    348           n._counted = true
     348        if (!(n = nodes[i])._countedByPrototype) { 
     349          n._countedByPrototype = Prototype.emptyFunction
    349350          results.push(Element.extend(n)); 
    350351        } 
     
    548549      h.mark(nodes); 
    549550      for (var i = 0, node; node = nodes[i]; i++) { 
    550         if (!node.parentNode._counted) { 
     551        if (!node.parentNode._countedByPrototype) { 
    551552          h.index(node.parentNode, reverse, ofType); 
    552553          indexed.push(node.parentNode); 
     
    586587      h.mark(exclusions); 
    587588      for (var i = 0, results = [], node; node = nodes[i]; i++) 
    588         if (!node._counted) results.push(node); 
     589        if (!node._countedByPrototype) results.push(node); 
    589590      h.unmark(exclusions); 
    590591      return results; 
     
    619620    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } 
    620621  }, 
     622   
     623  split: function(expression) { 
     624    var expressions = []; 
     625    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { 
     626      expressions.push(m[1].strip()); 
     627    }); 
     628    return expressions; 
     629  }, 
    621630 
    622631  matchElements: function(elements, expression) { 
     
    624633    h.mark(matches); 
    625634    for (var i = 0, results = [], element; element = elements[i]; i++) 
    626       if (element._counted) results.push(element); 
     635      if (element._countedByPrototype) results.push(element); 
    627636    h.unmark(matches); 
    628637    return results; 
     
    637646   
    638647  findChildElements: function(element, expressions) { 
    639     var exprs = expressions.join(','); 
    640     expressions = []; 
    641     exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { 
    642       expressions.push(m[1].strip()); 
    643     }); 
     648    expressions = Selector.split(expressions.join(',')); 
    644649    var results = [], h = Selector.handlers;     
    645650    for (var i = 0, l = expressions.length, selector; i < l; i++) { 
     
    652657 
    653658if (Prototype.Browser.IE) { 
    654   // IE returns comment nodes on getElementsByTagName("*"). 
    655   // Filter them out. 
    656   Selector.handlers.concat = function(a, b) { 
    657     for (var i = 0, node; node = b[i]; i++) 
    658       if (node.tagName !== "!") a.push(node);       
    659     return a; 
    660   }; 
     659  Object.extend(Selector.handlers, { 
     660    // IE returns comment nodes on getElementsByTagName("*"). 
     661    // Filter them out. 
     662    concat: function(a, b) { 
     663      for (var i = 0, node; node = b[i]; i++) 
     664        if (node.tagName !== "!") a.push(node); 
     665      return a; 
     666    }, 
     667     
     668    // IE improperly serializes _countedByPrototype in (inner|outer)HTML. 
     669    unmark: function(nodes) { 
     670      for (var i = 0, node; node = nodes[i]; i++) 
     671        node.removeAttribute('_countedByPrototype'); 
     672      return nodes;   
     673    } 
     674  });   
    661675} 
    662676 
  • spinoffs/prototype/trunk/test/unit/event.html

    r8580 r8721  
    2727  <p id="inner">One two three <span id="span">four</span></p> 
    2828</div> 
     29<div id="container"><div></div></div> 
    2930 
    3031<!-- Tests follow --> 
     
    175176       
    176177      span.observe("test:somethingHappened", observer); 
    177       eventID = span._eventID; 
     178      eventID = span._prototypeEventID; 
    178179       
    179180      assert(Event.cache[eventID]); 
     
    241242      assertEqual(null, event.findElement('div.does_not_exist')); 
    242243      assertElementMatches(event.findElement('.does_not_exist, span'), 'span#span'); 
     244    }}, 
     245     
     246    testEventIDDuplication: function() { with(this) { 
     247      $('container').down().observe("test:somethingHappened", Prototype.emptyFunction); 
     248      $('container').innerHTML += $('container').innerHTML; 
     249      assertUndefined($('container').down(1)._prototypeEventID); 
    243250    }} 
    244251  }); 
  • spinoffs/prototype/trunk/test/unit/selector.html

    r8709 r8721  
    8989    <input type="hidden" id="commaTwo" name="foo2" value="oops" /> 
    9090  </form> 
    91    
     91  <div id="counted_container"><div class="is_counted"></div></div> 
    9292</div> <!-- #fixtures --> 
    9393 
     
    443443      assert(typeof results[1].show == 'function'); 
    444444      assert(typeof results[2].show == 'function'); 
     445    }}, 
     446     
     447    testCountedIsNotAnAttribute: function() { with(this) { 
     448      var el = $('list'); 
     449      Selector.handlers.mark([el]); 
     450      assert(!el.innerHTML.include("_counted")); 
     451      Selector.handlers.unmark([el]); 
     452      assert(!el.innerHTML.include("_counted"));       
     453    }}, 
     454 
     455    testCopiedNodesGetIncluded: function(){ with(this) { 
     456      assertElementsMatch( 
     457        Selector.matchElements($('counted_container').descendants(), 'div'), 
     458        'div.is_counted' 
     459      ); 
     460      $('counted_container').innerHTML += $('counted_container').innerHTML; 
     461      assertElementsMatch( 
     462        Selector.matchElements($('counted_container').descendants(), 'div'), 'div.is_counted',  
     463        'div.is_counted' 
     464      ); 
    445465    }} 
    446466  }); 
     467   
    447468// ]]> 
    448469</script>