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

Ticket #11475: iframe_patch.diff

File iframe_patch.diff, 7.4 kB (added by jdalton, 4 months ago)
  • dom.js

    old new  
    1111 
    1212if (Prototype.BrowserFeatures.XPath) { 
    1313  document._getElementsByXPath = function(expression, parentElement) { 
    14     var results = []; 
    15     var query = document.evaluate(expression, $(parentElement) || document
     14    var results = [], doc = Element._getDocument(parentElement), 
     15    query = doc.evaluate(expression, $(parentElement) || doc
    1616      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
    1717    for (var i = 0, length = query.snapshotLength; i < length; i++) 
    1818      results.push(Element.extend(query.snapshotItem(i))); 
     
    512512  }, 
    513513 
    514514  positionedOffset: function(element) { 
    515     var valueT = 0, valueL = 0
     515    var valueT = 0, valueL = 0, body = Element._getBodyElement(element)
    516516    do { 
    517517      valueT += element.offsetTop  || 0; 
    518518      valueL += element.offsetLeft || 0; 
    519519      element = element.offsetParent; 
    520520      if (element) { 
    521         if (element.tagName.toUpperCase() == 'BODY') break; 
     521        if (element === body) break; 
    522522        var p = Element.getStyle(element, 'position'); 
    523523        if (p !== 'static') break; 
    524524      } 
     
    577577  }, 
    578578   
    579579  getOffsetParent: function(element) { 
     580    var body = Element._getBodyElement(element); 
    580581    if (element.offsetParent) return $(element.offsetParent); 
    581     if (element == document.body) return $(element); 
     582    if (element == body) return $(body); 
    582583     
    583     while ((element = element.parentNode) && element != document.body) 
     584    while ((element = element.parentNode) && element != body) 
    584585      if (Element.getStyle(element, 'position') != 'static') 
    585586        return $(element); 
    586587 
    587     return $(document.body); 
     588    return $(body); 
    588589  }, 
    589590 
    590591  viewportOffset: function(forElement) { 
    591     var valueT = 0, valueL = 0
     592    forElement = $(forElement)
    592593 
    593     var element = forElement; 
     594    var valueT = 0, valueL = 0, 
     595    element = forElement, body = Element._getBodyElement(element); 
    594596    do { 
    595597      valueT += element.offsetTop  || 0; 
    596598      valueL += element.offsetLeft || 0; 
    597599 
    598600      // Safari fix 
    599       if (element.offsetParent == document.body && 
     601      if (element.offsetParent === body && 
    600602        Element.getStyle(element, 'position') == 'absolute') break; 
    601603 
    602604    } while (element = element.offsetParent); 
    603605 
    604606    element = forElement; 
    605607    do { 
    606       if (!Prototype.Browser.Opera || element.tagName.toUpperCase() == 'BODY') { 
     608      if (!Prototype.Browser.Opera || element === body) { 
    607609        valueT -= element.scrollTop  || 0; 
    608610        valueL -= element.scrollLeft || 0; 
    609611      } 
     
    613615  }, 
    614616 
    615617  clonePosition: function(element, source) { 
    616     var options = Object.extend({ 
     618    element = $(element); 
     619 
     620    var body = Element._getBodyElement(element), 
     621    options = Object.extend({ 
    617622      setLeft:    true, 
    618623      setTop:     true, 
    619624      setWidth:   true, 
     
    627632    var p = source.viewportOffset(); 
    628633 
    629634    // find coordinate system to use 
    630     element = $(element); 
    631635    var delta = [0, 0]; 
    632636    var parent = null; 
    633637    // delta [0,0] will do fine with position: fixed elements,  
     
    638642    } 
    639643 
    640644    // correct by body offsets (fixes Safari) 
    641     if (parent == document.body) { 
    642       delta[0] -= document.body.offsetLeft; 
    643       delta[1] -= document.body.offsetTop;  
     645    if (parent === body) { 
     646      delta[0] -= body.offsetLeft; 
     647      delta[1] -= body.offsetTop;  
    644648    } 
    645649 
    646650    // set position 
     
    659663  childElements: Element.Methods.immediateDescendants 
    660664}); 
    661665 
     666Element._getDocument = function(element){ //assume element is not null 
     667  return element.ownerDocument || (element.nodeName == '#document')? element : document; 
     668}; 
     669 
     670Element._getDocumentElement = function(element){ 
     671  return Element._getDocument(element).documentElement; 
     672}; 
     673 
     674Element._getBodyElement = function(element){ 
     675  return Element._getDocument(element).body; 
     676}; 
     677 
    662678Element._attributeTranslations = { 
    663679  write: { 
    664680    names: { 
     
    918934  // positioned.  For performance reasons, redefine Element#cumulativeOffset for 
    919935  // KHTML/WebKit only. 
    920936  Element.Methods.cumulativeOffset = function(element) { 
    921     var valueT = 0, valueL = 0; 
     937    element = $(element); 
     938    var valueT = 0, valueL = 0, body = Element._getBodyElement(element); 
    922939    do { 
    923940      valueT += element.offsetTop  || 0; 
    924941      valueL += element.offsetLeft || 0; 
    925       if (element.offsetParent == document.body) 
     942      if (element.offsetParent == body) 
    926943        if (Element.getStyle(element, 'position') == 'absolute') break; 
    927944         
    928945      element = element.offsetParent; 
  • event.js

    old new  
    242242   
    243243    fire: function(element, eventName, memo) { 
    244244      element = $(element); 
    245       if (element == document && document.createEvent && !element.dispatchEvent) 
    246         element = document.documentElement; 
    247          
    248       var event; 
    249       if (document.createEvent) { 
    250         event = document.createEvent("HTMLEvents"); 
     245      var event, doc = Element._getDocument(element); 
     246      if (element == doc && doc.createEvent && !element.dispatchEvent) 
     247        element = doc.documentElement; 
     248       
     249      if (doc.createEvent) { 
     250        event = doc.createEvent("HTMLEvents"); 
    251251        event.initEvent("dataavailable", true, true); 
    252252      } else { 
    253         event = document.createEventObject(); 
     253        event = doc.createEventObject(); 
    254254        event.eventType = "ondataavailable"; 
    255255      } 
    256256 
    257257      event.eventName = eventName; 
    258258      event.memo = memo || { }; 
    259259 
    260       if (document.createEvent) { 
     260      if (doc.createEvent) { 
    261261        element.dispatchEvent(event); 
    262262      } else { 
    263263        element.fireEvent(event.eventType, event); 
  • selector.js

    old new  
    109109          } else { 
    110110            // reluctantly do a document-wide search 
    111111            // and look for a match in the array 
    112             return this.findElements(document).include(element); 
     112            return this.findElements(Element._getDocument(element)).include(element); 
    113113          } 
    114114        } 
    115115      } 
     
    419419    id: function(nodes, root, id, combinator) { 
    420420      var targetNode = $(id), h = Selector.handlers; 
    421421      if (!targetNode) return []; 
    422       if (!nodes && root == document) return [targetNode]; 
     422      if (!nodes && root == Element._getDocument(root)) return [targetNode]; 
    423423      if (nodes) { 
    424424        if (combinator) { 
    425425          if (combinator == 'child') { 
     
    670670      for (var i = 0, node; node = nodes[i]; i++) 
    671671        node.removeAttribute('_countedByPrototype'); 
    672672      return nodes;   
    673     } 
    674   });   
     673    }, 
     674     
     675    // IE doesn't find elements by id if they are not attached to the document 
     676    id: Selector.handlers.id.wrap(function(proceed, nodes, root, id, combinator) { 
     677      var targetNode = $(id); 
     678      if (!targetNode && (root.sourceIndex < 1 || root == Element._getDocument(root))) { 
     679        var nodes = root.getElementsByTagName('*'), i = nodes.length; 
     680        while(i){ //faster than for-loop? 
     681          if(nodes[--i].id == id) { 
     682            targetNode = nodes[i]; break; 
     683          } 
     684        } 
     685      } 
     686      return proceed(nodes, root, targetNode, combinator); 
     687    }) 
     688  }); 
    675689} 
    676690 
    677691function $$() {