Changeset 8721
- Timestamp:
- 01/25/08 18:49:40 (8 months ago)
- Files:
-
- spinoffs/prototype/trunk/CHANGELOG (modified) (1 diff)
- spinoffs/prototype/trunk/src/event.js (modified) (1 diff)
- spinoffs/prototype/trunk/src/selector.js (modified) (10 diffs)
- spinoffs/prototype/trunk/test/unit/event.html (modified) (3 diffs)
- spinoffs/prototype/trunk/test/unit/selector.html (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
spinoffs/prototype/trunk/CHANGELOG
r8714 r8721 1 1 *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] 2 4 3 5 * Make Ajax.Request#isSameOrigin JavaScript Lint compliant. [Andrew Dupont] spinoffs/prototype/trunk/src/event.js
r8548 r8721 129 129 Object.extend(Event, (function() { 130 130 var cache = Event.cache; 131 131 132 132 function getEventID(element) { 133 if (element._ eventID) return element._eventID;133 if (element._prototypeEventID) return element._prototypeEventID[0]; 134 134 arguments.callee.id = arguments.callee.id || 1; 135 return element._ eventID = ++arguments.callee.id;135 return element._prototypeEventID = [++arguments.callee.id]; 136 136 } 137 137 spinoffs/prototype/trunk/src/selector.js
r8709 r8721 313 313 // marks an array of nodes for counting 314 314 mark: function(nodes) { 315 var _true = Prototype.emptyFunction; 315 316 for (var i = 0, node; node = nodes[i]; i++) 316 node._counted =true;317 node._countedByPrototype = _true; 317 318 return nodes; 318 319 }, … … 320 321 unmark: function(nodes) { 321 322 for (var i = 0, node; node = nodes[i]; i++) 322 node._counted = undefined;323 node._countedByPrototype = undefined; 323 324 return nodes; 324 325 }, … … 328 329 // rather than nth-child 329 330 index: function(parentNode, reverse, ofType) { 330 parentNode._counted = true;331 parentNode._countedByPrototype = Prototype.emptyFunction; 331 332 if (reverse) { 332 333 for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { 333 334 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++; 335 336 } 336 337 } else { 337 338 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++; 339 340 } 340 341 }, … … 345 346 var results = [], n; 346 347 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; 349 350 results.push(Element.extend(n)); 350 351 } … … 548 549 h.mark(nodes); 549 550 for (var i = 0, node; node = nodes[i]; i++) { 550 if (!node.parentNode._counted ) {551 if (!node.parentNode._countedByPrototype) { 551 552 h.index(node.parentNode, reverse, ofType); 552 553 indexed.push(node.parentNode); … … 586 587 h.mark(exclusions); 587 588 for (var i = 0, results = [], node; node = nodes[i]; i++) 588 if (!node._counted ) results.push(node);589 if (!node._countedByPrototype) results.push(node); 589 590 h.unmark(exclusions); 590 591 return results; … … 619 620 '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } 620 621 }, 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 }, 621 630 622 631 matchElements: function(elements, expression) { … … 624 633 h.mark(matches); 625 634 for (var i = 0, results = [], element; element = elements[i]; i++) 626 if (element._counted ) results.push(element);635 if (element._countedByPrototype) results.push(element); 627 636 h.unmark(matches); 628 637 return results; … … 637 646 638 647 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(',')); 644 649 var results = [], h = Selector.handlers; 645 650 for (var i = 0, l = expressions.length, selector; i < l; i++) { … … 652 657 653 658 if (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 }); 661 675 } 662 676 spinoffs/prototype/trunk/test/unit/event.html
r8580 r8721 27 27 <p id="inner">One two three <span id="span">four</span></p> 28 28 </div> 29 <div id="container"><div></div></div> 29 30 30 31 <!-- Tests follow --> … … 175 176 176 177 span.observe("test:somethingHappened", observer); 177 eventID = span._ eventID;178 eventID = span._prototypeEventID; 178 179 179 180 assert(Event.cache[eventID]); … … 241 242 assertEqual(null, event.findElement('div.does_not_exist')); 242 243 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); 243 250 }} 244 251 }); spinoffs/prototype/trunk/test/unit/selector.html
r8709 r8721 89 89 <input type="hidden" id="commaTwo" name="foo2" value="oops" /> 90 90 </form> 91 91 <div id="counted_container"><div class="is_counted"></div></div> 92 92 </div> <!-- #fixtures --> 93 93 … … 443 443 assert(typeof results[1].show == 'function'); 444 444 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 ); 445 465 }} 446 466 }); 467 447 468 // ]]> 448 469 </script>