Changeset 277 for trunk


Ignore:
Timestamp:
07/19/05 06:23:58 (14 years ago)
Author:
gogo
Message:

Some leak patching for Internet Explorer. This actually works! See
ticket:30

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/examples/full_example-body.html

    r238 r277  
     1<!DOCTYPE BHTML PUBLIC "-//BC//DTD BHTML 3.2 Final//EN"> 
    12<html> 
    23<head> 
  • trunk/examples/stylist.css

    r14 r277  
    2929} 
    3030 
     31img.polaroid { border:1px solid black; background-color:white; padding:10px; padding-bottom:30px; } 
  • trunk/examples/testbed.html

    r260 r277  
    5555      xinha_plugins = xinha_plugins ? xinha_plugins : 
    5656      [ 
    57         'FullScreen' 
     57         
    5858      ]; 
    5959             // THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :) 
     
    8484 
    8585       xinha_config = xinha_config ? xinha_config : new HTMLArea.Config(); 
     86/* 
     87       // We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL 
     88      //  otherwise it won't work! 
     89      xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'stylist.css')); 
    8690 
     91      // Or we can load styles directly 
     92      xinha_config.stylistLoadStyles('p.red_text { color:red }'); 
     93 
     94      // If you want to provide "friendly" names you can do so like 
     95      // (you can do this for stylistLoadStylesheet as well) 
     96      xinha_config.stylistLoadStyles('p.pink_text { color:pink }', {'p.pink_text' : 'Pretty Pink'}); 
     97*/ 
    8798      /** STEP 3 *************************************************************** 
    8899       * We first create editors for the textareas. 
     
    125136 
    126137    window.onload   = xinha_init; 
    127     window.onunload = HTMLArea.flushEvents; 
     138    // window.onunload = HTMLArea.collectGarbageForIE; 
    128139  </script> 
    129140</head> 
     
    158169    document.write(document.compatMode); 
    159170  </script> 
     171  <a href="#" onclick="xinha_editors.myTextArea.hidePanels();">Hide</a> 
     172  <a href="#" onclick="xinha_editors.myTextArea.showPanels();">Show</a> 
    160173</body> 
    161174</html> 
  • trunk/htmlarea.js

    r275 r277  
    9292    } 
    9393    this._textArea = textarea; 
    94  
     94        
    9595    // Before we modify anything, get the initial textarea size 
    9696    this._initial_ta_size = 
     
    147147      panels[i].div = panels[i].container; // legacy 
    148148      panels[i].container.className = 'panels ' + i; 
    149     } 
     149      HTMLArea.freeLater(panels[i], 'container'); 
     150      HTMLArea.freeLater(panels[i], 'div');       
     151    } 
     152    HTMLArea.freeLater(this, '_textArea'); 
    150153  } 
    151154}; 
     
    483486    btn[0] = HTMLArea._lc(btn[0]); //initialize tooltip 
    484487  } 
     488 
    485489}; 
    486490 
     
    717721  toolbar.unselectable = "1"; 
    718722 
     723  HTMLArea.freeLater(this, '_toolBar'); 
     724  HTMLArea.freeLater(this, '_toolbar'); 
     725   
    719726  var tb_row = null; 
    720727  var tb_objects = new Object(); 
     
    722729 
    723730        this._createToolbar1(editor, toolbar, tb_objects); 
    724         this._htmlArea.appendChild(toolbar); 
     731        this._htmlArea.appendChild(toolbar);       
     732   
    725733  return toolbar; 
    726734} 
     
    867875        context : context 
    868876      }; 
     877       
     878      HTMLArea.freeLater(obj); 
     879       
    869880      tb_objects[txt] = obj; 
     881       
    870882      for (var i in options) { 
    871883        var op = document.createElement("option"); 
     
    913925        state   : setButtonStatus // for changing state 
    914926      }; 
     927       
     928      HTMLArea.freeLater(obj); 
     929       
    915930      tb_objects[txt] = obj; 
    916931      break; 
     
    937952        context : btn[4] || null // enabled in a certain context? 
    938953      }; 
     954       
     955      HTMLArea.freeLater(obj); 
     956       
    939957      tb_objects[txt] = obj; 
    940958      // handlers to emulate nice flat toolbar buttons 
     
    972990      el.appendChild(i_contain); 
    973991 
    974       obj.imgel = img; 
     992      obj.imgel = img;       
    975993      obj.swapImage = function(newimg) 
    976994      { 
     
    9891007        } 
    9901008      } 
    991  
     1009       
    9921010    } else if (!el) { 
    9931011      el = createSelect(txt); 
     
    10641082  { 
    10651083    doc._htmlareaImgCache = { }; 
     1084    HTMLArea.freeLater(doc._htmlareaImgCache); 
    10661085  } 
    10671086 
     
    11241143  statusbar.className = "statusBar"; 
    11251144  this._statusBar = statusbar; 
    1126  
     1145  HTMLArea.freeLater(this, '_statusBar'); 
     1146   
    11271147  // statusbar.appendChild(document.createTextNode(HTMLArea._lc("Path") + ": ")); 
    11281148  // creates a holder for the path view 
     
    11311151  div.innerHTML = HTMLArea._lc("Path") + ": "; 
    11321152  this._statusBarTree = div; 
     1153  HTMLArea.freeLater(this, '_statusBarTree'); 
    11331154  this._statusBar.appendChild(div); 
    11341155 
     
    11371158  div.style.display = "none"; 
    11381159  this._statusBarTextMode = div; 
     1160  HTMLArea.freeLater(this, '_statusBarTextMode'); 
    11391161  this._statusBar.appendChild(div); 
    11401162 
     
    12571279  } 
    12581280 
     1281  HTMLArea.freeLater(this._framework); 
     1282   
    12591283  var fw = this._framework; 
    12601284  fw.table.border="0"; 
     
    12981322  var htmlarea = this._framework.table; 
    12991323  this._htmlArea = htmlarea; 
     1324  HTMLArea.freeLater(this, '_htmlArea'); 
    13001325  htmlarea.className = "htmlarea"; 
    13011326 
     
    13101335  this._iframe = iframe; 
    13111336  this._iframe.className = 'xinha_iframe'; 
    1312  
     1337  HTMLArea.freeLater(this, '_iframe'); 
     1338   
    13131339    // creates & appends the status bar 
    13141340  var statusbar = this._createStatusBar(); 
     
    18191845      if (editor._iframe.contentDocument) 
    18201846      { 
    1821         this._doc = editor._iframe.contentDocument; 
     1847        this._doc = editor._iframe.contentDocument;         
    18221848      } 
    18231849      else 
     
    18251851        this._doc = editor._iframe.contentWindow.document; 
    18261852      } 
    1827       doc = this._doc; 
     1853      doc = this._doc;       
    18281854      if (!doc) { // try later 
    18291855        if (HTMLArea.is_gecko) { 
     
    18391865      setTimeout(function() { editor.initIframe()}, 50); 
    18401866    } 
    1841  
     1867     
     1868    HTMLArea.freeLater(this, '_doc'); 
     1869     
    18421870    doc.open(); 
    18431871    if (!editor.config.fullPage) { 
     
    43404368    } 
    43414369  } 
    4342  
    4343   if(document.all) 
    4344   { 
    4345     for(var i = 0; i < document.all.length; i++) 
    4346     { 
    4347       for(var j in document.all[i]) 
    4348       { 
    4349         if(/^on/.test(j) && typeof document.all[i][j] == 'function') 
     4370   
     4371  /*  
     4372    // This code is very agressive, and incredibly slow in IE, so I've disabled it. 
     4373     
     4374    if(document.all) 
     4375    { 
     4376      for(var i = 0; i < document.all.length; i++) 
     4377      { 
     4378        for(var j in document.all[i]) 
    43504379        { 
    4351           document.all[i][j] = null; 
    4352           x++; 
    4353         } 
    4354       } 
    4355     } 
    4356   } 
    4357   alert('Flushed ' + x + ' events.'); 
     4380          if(/^on/.test(j) && typeof document.all[i][j] == 'function') 
     4381          { 
     4382            document.all[i][j] = null; 
     4383            x++; 
     4384          } 
     4385        } 
     4386      } 
     4387    } 
     4388  */ 
     4389   
     4390  // alert('Flushed ' + x + ' events.'); 
    43584391} 
    43594392 
     
    44394472{ 
    44404473  // Create a structure to hold our lists of event handlers 
    4441   if(typeof el._xinha_dom0Events == 'undefined')     el._xinha_dom0Events = { }; 
     4474  if(typeof el._xinha_dom0Events == 'undefined') 
     4475  { 
     4476    el._xinha_dom0Events = { }; 
     4477    HTMLArea.freeLater(el, '_xinha_dom0Events'); 
     4478  } 
    44424479 
    44434480  // Create a list of handlers for this event type 
     
    44824519  { 
    44834520    this._notifyListeners[ev] = [ ]; 
     4521    HTMLArea.freeLater(this, '_notifyListeners'); 
    44844522  } 
    44854523 
     
    54185456} 
    54195457 
     5458HTMLArea.toFree = [ ]; 
     5459HTMLArea.freeLater = function(obj,prop) 
     5460{ 
     5461  HTMLArea.toFree.push({o:obj,p:prop}); 
     5462} 
     5463 
     5464HTMLArea.free = function(obj, prop) 
     5465{ 
     5466  if(obj && !prop) 
     5467  { 
     5468    for(var p in obj) 
     5469    { 
     5470      HTMLArea.free(obj, p); 
     5471    } 
     5472  } 
     5473  else if (obj) 
     5474  { 
     5475    obj[prop] = null; 
     5476  } 
     5477} 
     5478 
     5479/** IE's Garbage Collector is broken very badly.  We will do our best to  
     5480 *   do it's job for it, but we can't be perfect. 
     5481 */ 
     5482 
     5483HTMLArea.collectGarbageForIE = function()  
     5484 
     5485  HTMLArea.flushEvents();    
     5486  for(var x = 0; x < HTMLArea.toFree.length; x++) 
     5487  { 
     5488    if(!HTMLArea.toFree[x].o) alert("What is " + x + ' ' + HTMLArea.toFree[x].o); 
     5489    HTMLArea.free(HTMLArea.toFree[x].o, HTMLArea.toFree[x].p); 
     5490  } 
     5491} 
    54205492 
    54215493HTMLArea.init(); 
     5494HTMLArea.addDom0Event(window,'unload',HTMLArea.collectGarbageForIE); 
Note: See TracChangeset for help on using the changeset viewer.