Changeset 169


Ignore:
Timestamp:
05/18/05 17:25:13 (14 years ago)
Author:
gogo
Message:

Fix to the plugin loading system to prevent spinlocking when a plugin
fails to load.

See #226

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/htmlarea.js

    r168 r169  
    16911691        edcellheight  -= parseInt(this.config.panel_dimensions.bottom); 
    16921692      } 
    1693       this._iframe.style.height   = (edcellheight - this._toolBar.offsetHeight - this._statusBar.offsetHeight) + 'px'; 
     1693      this._iframe.style.height   = edcellheight + 'px'; 
    16941694    } 
    16951695    else 
     
    20812081// return the plugin created to allow refresh when necessary 
    20822082HTMLArea.prototype.registerPlugin = function() { 
     2083  // We can only register plugins that have been succesfully loaded 
     2084  if 
     2085  ( 
     2086    plugin == null 
     2087    || typeof plugin == 'undefined' 
     2088    || (typeof plugin == 'string' && eval('typeof ' + plugin) == 'undefined') 
     2089  ) return false; 
     2090 
    20832091  var plugin = arguments[0]; 
    20842092  var args = []; 
     
    21262134    if(callback) 
    21272135    { 
    2128       callback(); 
    2129     } 
    2130     return; 
     2136      callback(pluginName); 
     2137    } 
     2138    return true; 
    21312139  } 
    21322140 
     
    21402148  if(callback) 
    21412149  { 
    2142     HTMLArea._loadback(plugin_file, callback); 
     2150    HTMLArea._loadback(plugin_file, function() { callback(pluginName); }); 
    21432151  } 
    21442152  else 
     
    21462154    document.write("<script type='text/javascript' src='" + plugin_file + "'></script>"); 
    21472155  } 
    2148 }; 
    2149  
     2156  return false; 
     2157}; 
     2158 
     2159HTMLArea._pluginLoadStatus = { }; 
    21502160HTMLArea.loadPlugins = function(plugins, callbackIfNotReady) 
    21512161{ 
     2162  // Rip the ones that are loaded and look for ones that have failed 
     2163  var retVal = true; 
    21522164  var nuPlugins = HTMLArea.cloneObject(plugins); 
    2153  
    21542165  while(nuPlugins.length) 
    21552166  { 
    2156     // Might already be loaded 
    2157     if(eval('typeof ' + nuPlugins[nuPlugins.length-1]) != 'undefined') 
    2158     { 
    2159       nuPlugins.pop(); 
     2167    var p = nuPlugins.pop(); 
     2168    if(typeof HTMLArea._pluginLoadStatus[p] == 'undefined') 
     2169    { 
     2170      // Load it 
     2171      HTMLArea._pluginLoadStatus[p] = 'loading'; 
     2172      HTMLArea.loadPlugin(p, 
     2173          function(plugin) 
     2174          { 
     2175            if(eval('typeof ' + plugin) != 'undefined') 
     2176            { 
     2177              HTMLArea._pluginLoadStatus[plugin] = 'ready'; 
     2178            } 
     2179            else 
     2180            { 
     2181              // Actually, this won't happen, because if the script fails 
     2182              // it will throw an exception preventing the callback from 
     2183              // running.  This will leave it always in the "loading" state 
     2184              // unfortunatly that means we can't fail plugins gracefully 
     2185              // by just skipping them. 
     2186              HTMLArea._pluginLoadStatus[plugin] = 'failed'; 
     2187            } 
     2188          } 
     2189      ); 
     2190      retVal = false; 
    21602191    } 
    21612192    else 
    21622193    { 
    2163       break; 
    2164     } 
    2165   } 
    2166  
    2167   if(!nuPlugins.length) 
    2168   { 
    2169     return true; 
    2170   } 
    2171  
    2172   HTMLArea.loadPlugin 
    2173   (nuPlugins.pop(), 
    2174       function() 
    2175       { 
    2176         if(HTMLArea.loadPlugins(nuPlugins, callbackIfNotReady)) 
    2177         { 
    2178           if(typeof callbackIfNotReady == 'function') 
    2179           { 
    2180             callbackIfNotReady(); 
    2181           } 
    2182         } 
    2183       } 
    2184   ); 
    2185   return false; 
     2194      switch(HTMLArea._pluginLoadStatus[p]) 
     2195      { 
     2196        case 'failed': 
     2197        case 'ready' : 
     2198        break; 
     2199 
     2200        case 'loading': 
     2201        default       : 
     2202         document.getElementsByTagName('form').item(0).parentNode.appendChild(document.createTextNode(p)); 
     2203         retVal = false; 
     2204         break; 
     2205      } 
     2206    } 
     2207  } 
     2208 
     2209  if(retVal) return true; // All done, just return 
     2210 
     2211  // Waiting on plugins to load, return false now and come back a bit later 
     2212  // if we have to callback 
     2213  if(callbackIfNotReady) 
     2214  { 
     2215    setTimeout(function() { if(HTMLArea.loadPlugins(plugins, callbackIfNotReady)) callbackIfNotReady(); }, 150); 
     2216  } 
     2217  return retVal; 
    21862218} 
    21872219 
Note: See TracChangeset for help on using the changeset viewer.