<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>chrome/content/fireunit/jsdiff.js</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/inspect.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/env.js</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue1256.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue1256.txt</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue176.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue372.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue372.txt</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue601.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue601.txt</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue700.html</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/issue700.txt</filename>
    </added>
    <added>
      <filename>chrome/content/fireunit/test/net/utils.js</filename>
    </added>
    <added>
      <filename>chrome/locale/en-US/fireunit.properties</filename>
    </added>
    <added>
      <filename>chrome/skin/classic/fireunit.css</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,2 +1,6 @@
-content fireunit chrome/content/fireunit/ xpcnativewrappers=no
+content fireunit  chrome/content/fireunit/ xpcnativewrappers=no
+skin	fireunit  classic/1.0	chrome/skin/classic/
+
+locale	fireunit  en-US		chrome/locale/en-US/
+
 overlay chrome://firebug/content/firebugOverlay.xul         chrome://fireunit/content/fireunit.xul</diff>
      <filename>chrome.manifest</filename>
    </modified>
    <modified>
      <diff>@@ -5,274 +5,979 @@
 
 FBL.ns(function() { with (FBL) { 
 
-var panelName = &quot;Test&quot;;
+// Constants
+//-----------------------------------------------------------------------------
 
-var testQueue;
-var queueResults = &quot;&quot;;
-var server;
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+
+var panelName = &quot;test&quot;;     // uniques ID of the Test panel
+var testQueue;              // tests to be executed
+var queueResults = [];      // test results collected
+var server;                 // HTTP local server
 var uuid = 1;
 var serverPort = 7080;
 
-var cache = Components.classes[&quot;@mozilla.org/network/cache-service;1&quot;].getService(Components.interfaces.nsICacheService);
-
-/**
- * Module implementation.
- */
-Firebug.FireUnitModule = extend(Firebug.Module, { 
-    showPanel: function(browser, panel) { 
-      var isHwPanel = panel &amp;&amp; panel.name == panelName; 
-      var hwButtons = browser.chrome.$(&quot;fbFireUnitButtons&quot;); 
-      collapse(hwButtons, !isHwPanel); 
+// Services
+var cache = Cc[&quot;@mozilla.org/network/cache-service;1&quot;].getService(Ci.nsICacheService);
+
+// Module implementation.
+//-----------------------------------------------------------------------------
+
+/**
+ * This objects represents a module of Fireunit extension. This object is 
+ * responsible for injecting the &quot;fireunit&quot; object into a web page.
+ */
+Firebug.FireUnitModule = extend(Firebug.Module, 
+{
+    initialize: function()
+    {
+        if (FBTrace.DBG_FIREUNIT)
+           FBTrace.sysout(&quot;fireunit.FireUnitModule.initialize&quot;);
+
+        // Add listener for log customization
+        Firebug.TraceModule.addListener(this);
+    },
+
+    shutdown: function() 
+    {
+        Firebug.TraceModule.removeListener(this);
+    },
+
+    reattachContext: function(browser, context)
+    {
+        if (browser.detached)
+        {
+            // If Firebug is opened in a new window, the stylesheet must be 
+            // appended again.
+            this.addStyleSheets(context.window.document);
+        }
+    },
+
+    showPanel: function(browser, panel) 
+    {
+        // xxxHonza: there is one button in toolbar that isn't working yet.
+        var isHwPanel = panel &amp;&amp; panel.name == panelName;
+        var hwButtons = browser.chrome.$(&quot;fbFireUnitButtons&quot;);
+        collapse(hwButtons, !isHwPanel);
     },
     
-    watchWindow: function(context, win){
+    watchWindow: function(context, win)
+    {
         if (win.wrappedJSObject &amp;&amp; win.wrappedJSObject.fireunit)
             return;
 
-        function clean( str ) {
-          return str.replace(/&amp;/g, &quot;&amp;amp;&quot;).replace(/&lt;/g, &quot;&amp;lt;&quot;).replace(/&gt;/g, &quot;&amp;gt;&quot;);
-        }
+        // Inject &quot;fireunit&quot; object into the test page. This object 
+        // provides all necessary APIs to write a unit test.
+        win.wrappedJSObject.fireunit = new this.Fireunit(context, win);
+    },
+    
+    unWatchWindow: function()
+    {
+        delete win.wrappedJSObject.fireunit;
+    },
+
+    addStyleSheets: function(panel)
+    {
+	    this.addStyleSheet(panel.document, &quot;chrome://fireunit/skin/tabView.css&quot;, &quot;tabViewCss&quot;);
+	    this.addStyleSheet(panel.document, &quot;chrome://fireunit/skin/fireunit.css&quot;, &quot;fireUnitCss&quot;);
+    },
+
+    // xxxHonza: There should be APIs in lib.js to easily append a new stylesheet.
+    addStyleSheet: function(doc, uri, id)
+    {
+        // Make sure the stylesheet isn't appended twice. 
+        if ($(id, doc))
+            return;
+
+        var styleSheet = createStyleSheet(doc, uri);
+        styleSheet.setAttribute(&quot;id&quot;, id);
+	    addStyleSheet(doc, styleSheet);
+    },
+
+    /**
+     * Trace console support
+     */
+    onLoadConsole: function(win, rootNode) // Called when console window is loaded.
+    {
+        this.addStyleSheet(rootNode.ownerDocument, 
+            &quot;chrome://fireunit/skin/fireunit.css&quot;, 
+            &quot;fireUnitCss&quot;);
+    },
+
+    // Called when a new message is logged in to the trace-console window.
+    onDump: function(message)
+    {
+        var index = message.text.indexOf(&quot;fireunit.&quot;);
+        if (index == 0) {
+            message.text = message.text.substr(&quot;fireunit.&quot;.length);
+            message.type = &quot;DBG_FIREUNIT&quot;;
+        }
+    }
+}); 
 
-        var queue = [];
+// Fireunit object implementation.
+//-----------------------------------------------------------------------------
 
-        function addToQueue(fn){}
+/**
+ * This object is injected into the test page as &quot;fireunit&quot; in order to 
+ * provider necessary APIs for test implementation.
+ */
+Firebug.FireUnitModule.Fireunit = function(context, win)
+{
+    this.context = context;
+    this.win = win;
+}
 
-        function removeFromQueue(){}
+Firebug.FireUnitModule.Fireunit.prototype = function() 
+{
+    var queue = [];
+
+    function addToQueue(fn) {
+    }
 
-        function getServer(){
-          if ( !server ) {
+    function removeFromQueue() {
+    }
+
+    function getServer() {
+        if ( !server ) {
             server = new nsHttpServer();
             server.start( serverPort );
-          }
-          return server;
-	}
-
-        function chromeToPath(aPath){
-           if (!aPath || !(/^chrome:/.test(aPath)))
-              return urlToPath( aPath );
+        }
+        return server;
+    }
 
-           var ios = Components.classes['@mozilla.org/network/io-service;1'].getService(Components.interfaces[&quot;nsIIOService&quot;]);
-           var uri = ios.newURI(aPath, &quot;UTF-8&quot;, null);
-           var cr = Components.classes['@mozilla.org/chrome/chrome-registry;1'].getService(Components.interfaces[&quot;nsIChromeRegistry&quot;]);
-           var rv = cr.convertChromeURL(uri).spec;
+    function chromeToPath(aPath) {
+       if (!aPath || !(/^chrome:/.test(aPath)))
+          return urlToPath( aPath );
 
-           if (/^file:/.test(rv))
-              rv = urlToPath(rv);
-           else
-              rv = urlToPath(&quot;file://&quot;+rv);
+       var ios = Cc['@mozilla.org/network/io-service;1'].getService(Ci[&quot;nsIIOService&quot;]);
+       var uri = ios.newURI(aPath, &quot;UTF-8&quot;, null);
+       var cr = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci[&quot;nsIChromeRegistry&quot;]);
+       var rv = cr.convertChromeURL(uri).spec;
 
-           return rv;
-        }
+       if (/^file:/.test(rv))
+          rv = urlToPath(rv);
+       else
+          rv = urlToPath(&quot;file://&quot;+rv);
 
-        function urlToPath(aPath){
-            if (!aPath || !/^file:/.test(aPath)) return;
-        
-            return Components.classes[&quot;@mozilla.org/network/protocol;1?name=file&quot;]
-                .createInstance(Components.interfaces.nsIFileProtocolHandler)
-                .getFileFromURLSpec(aPath);
-        }
+       return rv;
+    }
 
-        var winID = uuid++;
+    function urlToPath(aPath) {
+        if (!aPath || !/^file:/.test(aPath)) 
+            return;
+    
+        return Cc[&quot;@mozilla.org/network/protocol;1?name=file&quot;]
+            .createInstance(Ci.nsIFileProtocolHandler)
+            .getFileFromURLSpec(aPath);
+    }
 
-        win.wrappedJSObject.fireunit = {
-            forceHttp: function(){
-              cache.evictEntries(Components.interfaces.nsICache.STORE_ON_DISK);
-              cache.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
+    var winID = uuid++;
 
-              if ( win.wrappedJSObject.location.protocol !== &quot;http:&quot; ) {
-                var file = chromeToPath( win.wrappedJSObject.location + &quot;&quot; );
-                var dir = file.parent;
+    // Define fireunit APIs.
+    var fireunit = {
+        forceHttp: function() {
+          cache.evictEntries(Ci.nsICache.STORE_ON_DISK);
+          cache.evictEntries(Ci.nsICache.STORE_IN_MEMORY);
 
-                getServer().registerDirectory( &quot;/test&quot; + winID + &quot;/&quot;, dir );
+          if ( this.win.wrappedJSObject.location.protocol !== &quot;http:&quot; ) {
+            var file = chromeToPath( this.win.wrappedJSObject.location + &quot;&quot; );
+            var dir = file.parent;
 
-                win.wrappedJSObject.location = &quot;http://localhost:&quot; + serverPort + &quot;/test&quot; + winID + &quot;/&quot; + file.leafName;
+            getServer().registerDirectory( &quot;/test&quot; + winID + &quot;/&quot;, dir );
 
-                return false;
-              }
+            this.win.wrappedJSObject.location = &quot;http://localhost:&quot; + serverPort + &quot;/test&quot; + 
+                winID + &quot;/&quot; + file.leafName;
 
-              return true;
-            },
-            runTests: function() {
-              testQueue = Array.prototype.slice.call( arguments );
-              queueResults = &quot;&quot;;
+            return false;
+          }
 
-              this.testDone();
-            },
-            testDone: function() {
-              if ( testQueue ) {
-                if ( testQueue.length ) {
-                  win.wrappedJSObject.location = testQueue.shift();
-                } else {
-                  var panel = context.getPanel(panelName).panelNode;
-                  panel.innerHTML += queueResults;
-                  queueResults = testQueue = null;
-                }
-              }
-            },
-            id: function( id ) {
-              if ( typeof id == &quot;string&quot; ) {
-                if ( win.location.toString().indexOf(&quot;chrome:&quot;) == 0 ) {
-                  return document.getElementById( id );
-                } else {
-                  return win.document.getElementById( id );
-                }
-              }
-              return id;
-            },
-            ok: function( pass, msg ){
-              var results = &quot;&lt;li&gt;&lt;span style='color:&quot; +
-                (pass ? &quot;green&quot; : &quot;red&quot;) + &quot;;'&gt;&quot; +
-                (pass ? &quot;PASS&quot; : &quot;FAIL&quot;) + &quot;&lt;/span&gt; &quot; +
-                clean( msg ) + &quot;&lt;/li&gt;&quot;;
-
-              if ( testQueue ) {
-                queueResults += results;
-              } else {
-                var panel = context.getPanel(panelName).panelNode;
-                panel.innerHTML += results;
-              }
-            },
-            test: function( name, fn ) {
-              addToQueue( fn );
-            },
-            compare: function( expected, result, msg ) {
-              var pass = expected == result;
-              var panel = context.getPanel(panelName).panelNode;
-              panel.innerHTML += &quot;&lt;li&gt;&lt;span style='color:&quot; +
-                (pass ? &quot;green&quot; : &quot;red&quot;) + &quot;;'&gt;&quot; +
-                (pass ? &quot;PASS&quot; : &quot;FAIL&quot;) + &quot;&lt;/span&gt; &quot; +
-                clean( msg ) +
-                (pass ? &quot;&quot; : &quot;&lt;br/&gt;&lt;pre style='font-family:Courier;'&gt;  Expected: &quot; + clean( expected ) +
-                  &quot;\n    Result: &quot; + clean( result ) + &quot;&lt;/pre&gt;&quot;) + &quot;&lt;/li&gt;&quot;;
-            },
-            reCompare: function( expected, result, msg ) {
-              if (  RegExp( expected ).test( result ) ) {
-                return this.compare( expected, expected, msg );
-              } else {
-                return this.compare( expected, result, msg );
-              }
-            },
-            click: function( node ){
-              node = this.id( node );
-
-              if ( node.click ) {
-                return node.click();
-              }
-
-              var doc = node.ownerDocument, event = doc.createEvent(&quot;MouseEvents&quot;);
-              event.initMouseEvent(&quot;click&quot;, true, true, doc.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
-              return node.dispatchEvent( event );
-            },
-            focus: function( node ){
-              node = this.id( node );
-
-              if ( node.focus ) {
-                return node.focus();
-              }
-
-              var doc = node.ownerDocument, event = doc.createEvent(&quot;UIEvents&quot;);
-              event.initUIEvent(&quot;DOMFocusIn&quot;, true, true, doc.defaultView, 1);
-              return node.dispatchEvent( event );
-            },
-            value: function( node, text ){
-              node = this.id( node );
-
-              node.value = text;
-            },
-            key: function( node, letter ){
-              node = this.id( node );
-
-              var keyCode = letter, charCode = 0;
-
-              if ( typeof keyCode == &quot;string&quot; ) {
-                charCode = keyCode.charCodeAt(0);
-                keyCode = 0;
-              }
-
-              var doc = node.ownerDocument, event = doc.createEvent(&quot;KeyEvents&quot;);
-              event.initKeyEvent(&quot;keypress&quot;, true, true, doc.defaultView, false, false, false, false, keyCode, charCode);
-              return node.dispatchEvent( event );
-            },
-            panel: function( name ) {
-              // xxxHonza: in case of net panel tests the URL doesn't have to come from chrome.
-              //if ( win.location.toString().indexOf(&quot;chrome:&quot;) == 0 )
-                return FirebugContext.getPanel( name ).panelNode;
-            },
-            // HTTP Server
-            registerPathHandler: function(path, handler)
-            {
-                return getServer().registerPathHandler(path, function(metadata, response) {
-                    try {
-                        handler.apply(null, [metadata, response]);
-                    }
-                    catch (err) {
-                        FBTrace.dumpProperties(&quot;fireunit.registerPathHandler EXCEPTION&quot;, err);
-                    }
-                });
+          return true;
+        },
+        runTests: function() {
+          testQueue = Array.prototype.slice.call( arguments );
+          queueResults = [];
+
+          this.testDone();
+        },
+        testDone: function() {
+          if (FBTrace.DBG_FIREUNIT)
+            FBTrace.sysout(&quot;fireunit.testDone: &quot; + this.win.wrappedJSObject.location);
+
+          var panel = this.context.getPanel(panelName);
+          if ( testQueue ) {
+            if ( testQueue.length ) {
+              this.win.wrappedJSObject.location = testQueue.shift();
+            } else {
+              panel.appendResults(queueResults);
+              panel.appendSummary();
+              queueResults = testQueue = null;
             }
-        };
+          }
+          else {
+              panel.appendSummary();
+          }
+        },
+        id: function( id ) {
+          if ( typeof id == &quot;string&quot; ) {
+            if ( this.win.location.toString().indexOf(&quot;chrome:&quot;) == 0 ) {
+              return document.getElementById( id );
+            } else {
+              return this.win.document.getElementById( id );
+            }
+          }
+          return id;
+        },
+        ok: function( pass, msg ) {
+          var result = new Firebug.FireUnitModule.TestResult(this.win, pass, msg);
+          if ( testQueue ) {
+            queueResults.push(result);
+          } else {
+            var panel = this.context.getPanel(panelName);
+            panel.appendResults([result]);
+          }
+        },
+        test: function( name, fn ) {
+          addToQueue( fn );
+        },
+        compare: function( expected, actuall, msg ) {
+          var pass = expected == actuall;
+          var result = new Firebug.FireUnitModule.TestResult(this.win, pass, msg, 
+              expected, actuall);
+          if ( testQueue ) {
+            queueResults.push(result);
+          } else {
+            var panel = this.context.getPanel(panelName);
+            panel.appendResults([result]);
+          }
+        },
+        reCompare: function( expected, result, msg ) {
+          if (  RegExp( expected ).test( result ) ) {
+            return this.compare( expected, expected, msg );
+          } else {
+            return this.compare( expected, result, msg );
+          }
+        },
+        click: function( node ){
+          node = this.id( node );
 
-        win.wrappedJSObject.fireunit.__defineGetter__(&quot;Firebug&quot;, function() {
-            return Firebug;
-        });
+          if ( node.click ) {
+            return node.click();
+          }
 
-        win.wrappedJSObject.fireunit.__defineGetter__(&quot;FBL&quot;, function() {
-            return FBL;
-        });
+          var doc = node.ownerDocument, event = doc.createEvent(&quot;MouseEvents&quot;);
+          event.initMouseEvent(&quot;click&quot;, true, true, doc.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+          return node.dispatchEvent( event );
+        },
+        focus: function( node ){
+          node = this.id( node );
 
-        win.wrappedJSObject.fireunit.__defineGetter__(&quot;FirebugChrome&quot;, function() {
-            return FirebugChrome;
-        });
+          if ( node.focus ) {
+            return node.focus();
+          }
 
-        win.wrappedJSObject.fireunit.__defineGetter__(&quot;FBTrace&quot;, function() {
-            return FBTrace;
-        });
+          var doc = node.ownerDocument, event = doc.createEvent(&quot;UIEvents&quot;);
+          event.initUIEvent(&quot;DOMFocusIn&quot;, true, true, doc.defaultView, 1);
+          return node.dispatchEvent( event );
+        },
+        value: function( node, text ){
+          node = this.id( node );
 
-        win.wrappedJSObject.fireunit.__defineGetter__(&quot;FirebugContext&quot;, function() {
-            return FirebugContext;
-        });
-    },
-    
-    unWatchWindow: function(){
-        delete win.wrappedJSObject.fireunit;
-    }
-}); 
+          node.value = text;
+        },
+        key: function( node, letter ){
+          node = this.id( node );
+
+          var keyCode = letter, charCode = 0;
+
+          if ( typeof keyCode == &quot;string&quot; ) {
+            charCode = keyCode.charCodeAt(0);
+            keyCode = 0;
+          }
+
+          var doc = node.ownerDocument, event = doc.createEvent(&quot;KeyEvents&quot;);
+          event.initKeyEvent(&quot;keypress&quot;, true, true, doc.defaultView, false, false, false, 
+              false, keyCode, charCode);
+          return node.dispatchEvent( event );
+        },
+        panel: function( name ) {
+          // xxxHonza: in case of net panel tests the URL doesn't have to come from chrome,
+          // but also from local host.
+          if ( this.win.location.toString().indexOf(&quot;chrome:&quot;) == 0 ||
+              this.win.location.toString().indexOf(&quot;http://localhost:&quot; + serverPort) == 0)
+            return this.context.getPanel( name ).panelNode;
+        },
+        // HTTP Server
+        registerPathHandler: function(path, handler) {
+            return getServer().registerPathHandler(path, function(metadata, response) {
+                try {
+                    handler.apply(null, [metadata, response]);
+                }
+                catch (err) {
+                    FBTrace.dumpProperties(&quot;fireunit.registerPathHandler EXCEPTION&quot;, err);
+                }
+            });
+        }
+    };
+
+    // Getters for access to Firebug's internal APIs.
+    fireunit.__defineGetter__(&quot;Firebug&quot;, function() {
+        return Firebug;
+    });
+
+    fireunit.__defineGetter__(&quot;FBL&quot;, function() {
+        return FBL;
+    });
+
+    fireunit.__defineGetter__(&quot;FirebugChrome&quot;, function() {
+        return FirebugChrome;
+    });
+
+    fireunit.__defineGetter__(&quot;FBTrace&quot;, function() {
+        return FBTrace;
+    });
+
+    fireunit.__defineGetter__(&quot;FirebugContext&quot;, function() {
+        return FirebugContext;
+    });
+
+    return fireunit;
+}();
+
+// Localization
+//-----------------------------------------------------------------------------
+
+// xxxHonza: There should be APIs in lib.js to easily get localized strings 
+// from custom bundle.
+function $FU_STR(name)
+{
+    try
+    {
+        return document.getElementById(&quot;strings_fireUnit&quot;).getString(name.replace(' ', '_', &quot;g&quot;));
+    }
+    catch (err)
+    {
+        if (FBTrace.DBG_FIREUNIT)
+        {
+            FBTrace.sysout(&quot;fireunit.Missing translation for: &quot; + name + &quot;\n&quot;);
+            FBTrace.dumpProperties(&quot;fireunit.getString FAILS &quot;, err);
+        }
+    }
+
+    // Use only the label after last dot.
+    var index = name.lastIndexOf(&quot;.&quot;);
+    if (index &gt; 0)
+        name = name.substr(index + 1);
+
+    return name;
+}
+
+// Panel implementation
+//-----------------------------------------------------------------------------
 
 /**
- * Panel implementation
+ * This object representes a new Firebug panel that displyas list of logs 
+ * (test results) coming from executed tests. The panel also implements two
+ * options &quot;Passing Tests&quot; and &quot;Failing Tests&quot; that can be used to filter
+ * the content.
  */
 function FireUnitPanel() {} 
-FireUnitPanel.prototype = extend(Firebug.Panel, { 
-    name: panelName, 
-    title: panelName, 
+FireUnitPanel.prototype = extend(Firebug.Panel, 
+{
+    name: panelName,
+    title: $FU_STR(&quot;fireunit.panel.Test&quot;),
 
-    initialize: function() {
+    initialize: function() 
+    {
         Firebug.Panel.initialize.apply(this, arguments);
+
+        // Append custom stylesheet.
+        Firebug.FireUnitModule.addStyleSheets(this);
+
+        // Create basic content for the panel.
+        var rep = Firebug.FireUnitModule.TestResultRep;
+        this.table = rep.tableTag.replace({}, this.panelNode, rep);
     },
     
-    getOptionsMenuItems: function(context){
+    show: function(state)
+    {
+        this.updatePanelFilter();
+    },
+
+    // Called automatically by Firebug framework when a preference (from Firebug.prefDomain)
+    // is changed.
+    updateOption: function(name, value)
+    {
+        if (FBTrace.DBG_FIREUNIT)
+            FBTrace.sysout(&quot;fireunit.FireUnitPanel.updateOption: &quot; + name + &quot;: &quot; + value);
+
+        if (name == &quot;fireunit.showPass&quot; || name == &quot;fireunit.showFail&quot;)
+            this.updatePanelFilter();
+    },
+
+    updatePanelFilter: function()
+    {
+        var showPass = Firebug.getPref(Firebug.prefDomain, &quot;fireunit.showPass&quot;);
+        var showFail = Firebug.getPref(Firebug.prefDomain, &quot;fireunit.showFail&quot;);
+
+        // Update styles on the root table (contains the list of results).
+        // These styles ensure proper visibility of pass and fail tests according 
+        // to the preferences.
+        var panelNode = this.context.getPanel(panelName).panelNode;
+        var table = getElementByClass(panelNode, &quot;testTable&quot;);
+        showPass ? setClass(table, &quot;showPass&quot;) : removeClass(table, &quot;showPass&quot;);
+        showFail ? setClass(table, &quot;showFail&quot;) : removeClass(table, &quot;showFail&quot;);
+    },
+
+    getOptionsMenuItems: function(context)
+    {
         return [
-            this.optionMenu(&quot;Passing Tests&quot;, &quot;fireunit.showPass&quot;),
-            this.optionMenu(&quot;Failing Tests&quot;, &quot;fireunit.showFail&quot;)
+            this.optionMenu($FU_STR(&quot;fireunit.option.Passing_Tests&quot;), &quot;fireunit.showPass&quot;),
+            this.optionMenu($FU_STR(&quot;fireunit.option.Failing_Tests&quot;), &quot;fireunit.showFail&quot;)
         ];
     },
 
-    optionMenu: function(label, option){
+    optionMenu: function(label, option)
+    {
         var value = Firebug.getPref(Firebug.prefDomain, option);
-        return { 
-            label: label, 
-            nol10n: true, 
-            type: &quot;checkbox&quot;, 
-            checked: value, 
-            command: bindFixed(Firebug.setPref, this, Firebug.prefDomain, option, !value) 
+        return {
+            label: label,
+            nol10n: true,
+            type: &quot;checkbox&quot;,
+            checked: value,
+            command: bindFixed(Firebug.setPref, this, Firebug.prefDomain, option, !value)
         };
+    },
+
+    appendResults: function(queueResults)
+    {
+        // Append new test results.
+        var tbody = this.table.firstChild;
+        var row = Firebug.FireUnitModule.TestResultRep.resultTag.insertRows(
+            {results: queueResults}, tbody.lastChild ? tbody.lastChild : tbody)[0];
+
+        scrollToBottom(this.panelNode);
+    },
+
+    appendSummary: function()
+    {
+        var tbody = this.table.firstChild;
+
+        // Count number of passing and failing tests.
+        var summary = { passing: 0, failing: 0 };
+        for (var row = tbody.firstChild; row; row = row.nextSibling) {
+            if (hasClass(row, &quot;testResultRow&quot;))
+                hasClass(row, &quot;testError&quot;) ? summary.failing++ : summary.passing++;
+        }
+
+        // Append summary row.
+        var summaryRow = Firebug.FireUnitModule.TestResultRep.summaryTag.insertRows(
+            {summary: summary}, tbody.lastChild ? tbody.lastChild : tbody)[0];
+
+        // Activate our panel since this is what the user wants to see now.
+        this.context.chrome.selectPanel(panelName);
+        scrollToBottom(this.panelNode);
     }
 }); 
 
+// Domplate Repository
+//-----------------------------------------------------------------------------
+
+/**
+ * This template represents a &quot;test-result&quot; that is beening displayed within
+ * Fireunit's panel. Expandable and collapsible logic associated with each
+ * result is also implemented by this object.
+ */
+Firebug.FireUnitModule.TestResultRep = domplate(Firebug.Rep,
+{
+    tableTag:
+        TABLE({class: &quot;testTable&quot;, cellpadding: 0, cellspacing: 0, onclick: &quot;$onClick&quot;},
+            TBODY()
+        ),
+
+    resultTag:
+        FOR(&quot;result&quot;, &quot;$results&quot;,
+            TR({class: &quot;testResultRow&quot;, _repObject: &quot;$result&quot;,
+                $testError: &quot;$result|isError&quot;,
+                $testOK: &quot;$result|isOK&quot;},
+                    TD({class: &quot;testResultCol&quot;, width: &quot;100%&quot;},
+                    DIV({class: &quot;testResultMessage testResultLabel&quot;},
+                        &quot;$result|getMessage&quot;
+                    )
+                ),
+                TD({class: &quot;testResultCol&quot;},
+                    DIV({class: &quot;testResultFileName testResultLabel&quot;},
+                        &quot;$result.fileName&quot;
+                    )
+                )
+            )
+        ),
+
+    resultInfoTag:
+        TR({class: &quot;testResultInfoRow&quot;, _repObject: &quot;$result&quot;, 
+            $testError: &quot;$result|isError&quot;},
+            TD({class: &quot;testResultInfoCol&quot;, colspan: 2})
+        ),
+
+    summaryTag:
+        TR({class: &quot;testResultSummaryRow testResultRow&quot;},
+            TD({class: &quot;testResultCol&quot;, colspan: 2},
+                SPAN({class: &quot;testResultSummaryLabel&quot;,
+                    $summaryPass: &quot;$summary|summaryPassed&quot;},
+                    $FU_STR(&quot;fireunit.option.Passing_Tests&quot;),
+                    &quot;: $summary.passing&quot;
+                ),
+                SPAN({class: &quot;testResultSummaryLabel&quot;,
+                    $collapsed: &quot;$summary|summaryPassed&quot;,
+                    $testError: &quot;$summary.failing&quot;},
+                    $FU_STR(&quot;fireunit.option.Failing_Tests&quot;),
+                    &quot;: $summary.failing&quot;
+                )
+            )
+        ),
+
+    getMessage: function(result)
+    {
+        return result.msg;
+    },
+
+    isError: function(result)
+    {
+        return !result.pass;
+    },
+
+    isOK: function(result)
+    {
+        return result.pass;
+    },
+
+    summaryPassed: function(summary)
+    {
+        return !summary.failing;
+    },
+
+    onClick: function(event)
+    {
+        if (isLeftClick(event))
+        {
+            var row = getAncestorByClass(event.target, &quot;testResultRow&quot;);
+            if (row)
+            {
+                this.toggleResultRow(row);
+                cancelEvent(event);
+            }
+        }
+    },
+
+    toggleResultRow: function(row)
+    {
+        var result = row.repObject;
+
+        toggleClass(row, &quot;opened&quot;);
+        if (hasClass(row, &quot;opened&quot;))
+        {
+            var infoBodyRow = this.resultInfoTag.insertRows({result: result}, row)[0];
+            infoBodyRow.repObject = result;
+            this.initInfoBody(infoBodyRow);
+        }
+        else
+        {
+            var infoBodyRow = row.nextSibling;
+            var netInfoBox = getElementByClass(infoBodyRow, &quot;testResultInfoBody&quot;);
+            row.parentNode.removeChild(infoBodyRow);
+        }
+    },
+
+    initInfoBody: function(infoBodyRow)
+    {
+        var result = infoBodyRow.repObject;
+        var TabView = Firebug.FireUnitModule.TestResultTabView;
+        var tabViewNode = TabView.viewTag.replace({result: result}, infoBodyRow.firstChild, TabView);
+
+        // Select default tab.
+        TabView.selectTabByName(tabViewNode, &quot;Stack&quot;);
+    },
+
+    // Firebug rep support
+    supportsObject: function(testResult)
+    {
+        return testResult instanceof Firebug.FireUnitModule.TestResult;
+    },
+
+    browseObject: function(testResult, context)
+    {
+        return false;
+    },
+
+    getRealObject: function(testResult, context)
+    {
+        return testResult;
+    },
+    
+    getContextMenuItems: function(testResult, target, context)
+    {
+        // xxxHonza: The &quot;copy&quot; command shouldn't be there for now.
+        var popup = $(&quot;fbContextMenu&quot;);
+        FBL.eraseNode(popup);
+
+        var items = [];
+        
+        if (testResult.stack)
+        {
+            items.push({ 
+              label: $FU_STR(&quot;fireunit.item.View_Source&quot;), 
+              nol10n: true, 
+              command: bindFixed(this.onViewSource, this, testResult) 
+            });
+        }
+
+        return items;
+    },
+    
+    // Context menu commands
+    onViewSource: function(testResult)
+    {
+        var stackFrame = testResult.stack[0];
+        FirebugContext.chrome.select(new SourceLink(stackFrame.fileName, 
+            stackFrame.lineNumber, &quot;js&quot;));
+    },
+});
+
+//-----------------------------------------------------------------------------
+
+/**
+ * This template represents an &quot;info-body&quot; for expanded test-result. This
+ * object also implements logic related to a tab view.
+ *
+ * xxxHonza: since the tab view is used already used several times, it would
+ * be very useful to have a TabView widget defined in Firebug's Domplate
+ * repository.
+ */ 
+Firebug.FireUnitModule.TestResultTabView = domplate(Firebug.Rep,
+{
+    listeners: [],
+
+    viewTag:
+        TABLE({&quot;class&quot;: &quot;tabView&quot;, cellpadding: 0, cellspacing: 0},
+            TBODY(
+                TR({&quot;class&quot;: &quot;tabViewRow&quot;},
+                    TD({&quot;class&quot;: &quot;tabViewCol&quot;, valign: &quot;top&quot;},
+                        TAG(&quot;$tabList&quot;, {result: &quot;$result&quot;})
+                    )
+                )
+            )
+        ),
+
+    tabList:
+        DIV({&quot;class&quot;: &quot;tabViewBody&quot;},
+            TAG(&quot;$tabBar&quot;, {result: &quot;$result&quot;}),
+            TAG(&quot;$tabBodies&quot;)
+        ),
+
+    // List of tabs
+    tabBar: 
+        DIV({&quot;class&quot;: &quot;tabBar&quot;},
+            A({class: &quot;StackTab tab&quot;, onclick: &quot;$onClickTab&quot;, 
+                view: &quot;Stack&quot;, $collapsed: &quot;$result|hideStackTab&quot;},
+                    $FU_STR(&quot;fireunit.tab.Stack&quot;)
+            ),
+            A({class: &quot;CompareTab tab&quot;, onclick: &quot;$onClickTab&quot;, 
+                view: &quot;Compare&quot;, $collapsed: &quot;$result|hideCompareTab&quot;},
+                    $FU_STR(&quot;fireunit.tab.Compare&quot;)
+            )
+        ),
+
+    // List of tab bodies
+    tabBodies: 
+        DIV({&quot;class&quot;: &quot;tabBodies&quot;},
+            DIV({class: &quot;tabStackBody tabBody&quot;}),
+            DIV({class: &quot;tabCompareBody tabBody&quot;})
+        ),
+
+    // Stack tab displayed within resultInfoRow
+    stackTag:
+        TABLE({class: &quot;testResultStackInfoBody&quot;, cellpadding: 0, cellspacing: 0},
+            TBODY(
+                FOR(&quot;stack&quot;, &quot;$result.stack&quot;,
+                    TR(
+                        TD(
+                            A({class: &quot;stackFrameLink&quot;, onclick: &quot;$onClickStackFrame&quot;,
+                                lineNumber: &quot;$stack.lineNumber&quot;},
+                                &quot;$stack.fileName&quot;),
+                            SPAN(&quot;&amp;nbsp;&quot;),
+                            SPAN(&quot;(&quot;, &quot;$stack.lineNumber&quot;, &quot;)&quot;)
+                        )
+                    )
+                )
+            )
+        ),
+
+    // Compare tab displayed within resultInfoRow
+    compareTag:
+        TABLE({class: &quot;testResultCompareInfoBody&quot;, cellpadding: 0, cellspacing: 0},
+            TBODY(
+                TR({class: &quot;testResultCompareTitle expected&quot;},
+                    TD(
+                        $FU_STR(&quot;fireunit.title.Expected&quot;)
+                    ),
+                    TD({class: &quot;testResultCompareSwitch expected&quot;, 
+                        onclick: &quot;$onSwitchView&quot;},
+                        $FU_STR(&quot;fireunit.switch.view_source&quot;)
+                    )
+                ),
+                TR(
+                    TD({class: &quot;testResultExpected&quot;, colspan: 2})
+                ),
+                TR({class: &quot;testResultCompareTitle result&quot;},
+                    TD(
+                        $FU_STR(&quot;fireunit.title.Result&quot;)
+                    ),
+                    TD({class: &quot;testResultCompareSwitch result&quot;, 
+                        onclick: &quot;$onSwitchView&quot;},
+                        $FU_STR(&quot;fireunit.switch.view_source&quot;)
+                    )
+                ),
+                TR(
+                    TD({class: &quot;testResultResult&quot;, colspan: 2})
+                ),
+                TR({class: &quot;testResultCompareTitle diff&quot;, 
+                    $collapsed: &quot;$result|hideDiffGroup&quot;},
+                    TD({colspan: 2},
+                        $FU_STR(&quot;fireunit.title.Difference&quot;)
+                    )
+                ),
+                TR(
+                    TD({class: &quot;testResultDiff&quot;, colspan: 2})
+                )
+            )
+        ),
+
+    hideStackTab: function(result)
+    {
+        return false;
+    },
+
+    hideCompareTab: function(result)
+    {
+        return !(result.expected &amp;&amp; result.result);
+    },
+
+    hideDiffGroup: function(result)
+    {
+        return (result.expected == result.result);
+    },
+
+    onClickTab: function(event)
+    {
+        this.selectTab(event.target);
+    },
+
+    selectTabByName: function(tabView, tabName)
+    {
+        var tab = getElementByClass(tabView, tabName + &quot;Tab&quot;);
+        if (tab)
+            this.selectTab(tab);
+    },
+
+    selectTab: function(tab)
+    {
+        var view = tab.getAttribute(&quot;view&quot;);
+        var viewBody = getAncestorByClass(tab, &quot;tabViewBody&quot;);
+
+        // Deactivate current tab.
+        if (viewBody.selectedTab)
+        {
+            viewBody.selectedTab.removeAttribute(&quot;selected&quot;);
+            viewBody.selectedBody.removeAttribute(&quot;selected&quot;);
+        }
+
+        // Store info about new active tab. Each tab has to have a body, 
+        // which is identified by class.
+        var tabBody = getElementByClass(viewBody, &quot;tab&quot; + view + &quot;Body&quot;);
+        viewBody.selectedTab = tab;
+        viewBody.selectedBody = tabBody;
+
+        // Activate new tab.
+        viewBody.selectedTab.setAttribute(&quot;selected&quot;, &quot;true&quot;);
+        viewBody.selectedBody.setAttribute(&quot;selected&quot;, &quot;true&quot;);
+
+        this.updateTabBody(viewBody, view);
+    },
+
+    updateTabBody: function(viewBody, tabName)
+    {
+        if (FBTrace.DBG_FIREUNIT)
+            FBTrace.sysout(&quot;fireunit.TestResultRep.onUpdateTabBody: &quot; + tabName);
+
+        var tab = viewBody.selectedTab;
+        var infoRow = getAncestorByClass(viewBody, &quot;testResultInfoRow&quot;);
+        var result = infoRow.repObject;
+
+        // Update Stack tab content
+        var tabStackBody = getElementByClass(viewBody, &quot;tabStackBody&quot;);
+        if (tabName == &quot;Stack&quot; &amp;&amp; !tabStackBody.updated)
+        {
+            tabStackBody.updated = true;
+            this.stackTag.replace({result: result}, tabStackBody, this);
+        }
+
+        // Update Compare tab content
+        var tabCompareBody = getElementByClass(viewBody, &quot;tabCompareBody&quot;);
+        if (tabName == &quot;Compare&quot; &amp;&amp; !tabCompareBody.updated)
+        {
+            tabCompareBody.updated = true;
+            this.compareTag.replace({result: result}, tabCompareBody, this);
+
+            this.insertXml(result.expected, getElementByClass(viewBody, &quot;testResultExpected&quot;));
+            this.insertXml(result.result, getElementByClass(viewBody, &quot;testResultResult&quot;));
+
+            // The diff is generated only if there are any differences.
+            if (result.expected != result.result) {
+                var diffNode = getElementByClass(viewBody, &quot;testResultDiff&quot;);
+                var diffText = diffString(clean(result.expected), clean(result.result));
+                insertWrappedText(diffText, diffNode, true);
+            }
+        }
+    },
+
+    onSwitchView: function(event)
+    {
+        var target = event.target;
+        var expected = hasClass(target, &quot;expected&quot;);
+        var infoRow = getAncestorByClass(target, &quot;testResultInfoRow&quot;);
+        var result = infoRow.repObject;
+        var sourceBody = getElementByClass(infoRow, expected ? &quot;testResultExpected&quot; : &quot;testResultResult&quot;);
+
+        clearNode(sourceBody);
+
+        if (target.sourceView)
+            this.insertXml(result.expected, sourceBody);
+        else
+            insertWrappedText(expected ? result.expected : result.result, sourceBody);
+
+        target.innerHTML = $FU_STR(&quot;fireunit.switch.&quot; + (target.sourceView ? &quot;view_source&quot; : &quot;pretty_print&quot;));
+        target.sourceView = !target.sourceView;
+    },
+
+    onClickStackFrame: function(event)
+    {
+        FirebugContext.chrome.select(new SourceLink(event.target.innerHTML, 
+            event.target.getAttribute(&quot;lineNumber&quot;), &quot;js&quot; ))
+    },
+
+    insertXml: function(xml, parentNode)
+    {
+        var parser = CCIN(&quot;@mozilla.org/xmlextras/domparser;1&quot;, &quot;nsIDOMParser&quot;);
+
+        // Create helper root element (for the case where there is no signle root).
+        var tempXml = &quot;&lt;wrapper&gt;&quot; + xml + &quot;&lt;/wrapper&gt;&quot;;
+        var doc = parser.parseFromString(tempXml, &quot;text/xml&quot;);
+        var docElem = doc.documentElement;
+
+        // Error handling
+        var nsURI = &quot;http://www.mozilla.org/newlayout/xml/parsererror.xml&quot;;
+        if (docElem.namespaceURI == nsURI &amp;&amp; docElem.nodeName == &quot;parsererror&quot;) 
+        {
+            var errorNode = Firebug.FireUnitModule.ParseErrorRep.tag.replace({error: {
+                message: docElem.firstChild.nodeValue,
+                source: docElem.lastChild.textContent
+            }}, parentNode);
+
+            var xmlSource = getElementByClass(errorNode, &quot;xmlInfoSource&quot;);
+            insertWrappedText(xml, xmlSource);
+            return;
+        }
+
+        // Generate UI. Get appropriate domplate tag for every element that is found 
+        // within the helper &lt;wrapper&gt; and append it into the parent container.
+        for (var i=0; i&lt;docElem.childNodes.length; i++)
+            Firebug.HTMLPanel.CompleteElement.getNodeTag(docElem.childNodes[i]).
+                append({object: docElem.childNodes[i]}, parentNode);
+    }
+});
+
+//-----------------------------------------------------------------------------
+
+/**
+ * This template displays a parse-erros that can occurs when parsing
+ * expected and acuall results (see fireunit.compare method).
+ */
+Firebug.FireUnitModule.ParseErrorRep = domplate(Firebug.Rep, 
+{
+    tag:
+        DIV({class: &quot;xmlInfoError&quot;},
+            DIV({class: &quot;xmlInfoErrorMsg&quot;}, &quot;$error.message&quot;),
+            PRE({class: &quot;xmlInfoErrorSource&quot;}, &quot;$error|getSource&quot;),
+            BR(),
+            PRE({class: &quot;xmlInfoSource&quot;})
+        ),
+    
+    getSource: function(error) 
+    {
+        var parts = error.source.split(&quot;\n&quot;);
+        if (parts.length != 2)
+            return error.source;
+
+        var limit = 50;
+        var column = parts[1].length;
+        if (column &gt;= limit) {
+            parts[0] = &quot;...&quot; + parts[0].substr(column - limit);
+            parts[1] = &quot;...&quot; + parts[1].substr(column - limit);
+        }
+
+        if (parts[0].length &gt; 80)
+            parts[0] = parts[0].substr(0, 80) + &quot;...&quot;;
+
+        return parts.join(&quot;\n&quot;);
+    }
+});
+
+// Helper Objects
+//-----------------------------------------------------------------------------
+
 /**
- * Registration
+ * This object represents a test-result.
  */
+Firebug.FireUnitModule.TestResult = function(win, pass, msg, expected, result)
+{
+    var location = win.wrappedJSObject.location.href;
+    this.fileName = location.substr(location.lastIndexOf(&quot;/&quot;) + 1);
+
+    this.pass = pass ? true : false;
+    this.msg = clean(msg);
+    this.expected = expected;
+    this.result = result;
+
+    // xxxHonza: there should be perhaps simple API in lib.js to get the stack trace.
+    this.stack = [];
+    for (var frame = Components.stack, i=0; frame; frame = frame.caller, i++)
+    {
+        var fileName = unescape(frame.filename ? frame.filename : &quot;&quot;);
+        if (fileName == &quot;chrome://fireunit/content/fireunit.js&quot;)
+            continue;
+
+        var lineNumber = frame.lineNumber ? frame.lineNumber : &quot;&quot;;
+        this.stack.push({fileName:fileName, lineNumber:lineNumber});
+    }
+}
+
+// Utils
+//-----------------------------------------------------------------------------
+
+function clean( str ) 
+{
+    return str.replace(/&amp;/g, &quot;&amp;amp;&quot;).replace(/&lt;/g, &quot;&amp;lt;&quot;).replace(/&gt;/g, &quot;&amp;gt;&quot;);
+}
+
+// Registration
+//-----------------------------------------------------------------------------
+
 Firebug.registerPanel(FireUnitPanel); 
 Firebug.registerModule(Firebug.FireUnitModule); 
+Firebug.registerRep(Firebug.FireUnitModule.TestResultRep);
+
+//-----------------------------------------------------------------------------
 
 }});</diff>
      <filename>chrome/content/fireunit/fireunit.js</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,12 @@
 &lt;overlay xmlns=&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;&gt; 
     &lt;script src=&quot;chrome://fireunit/content/httpd.js&quot; type=&quot;application/x-javascript&quot;/&gt; 
     &lt;script src=&quot;chrome://fireunit/content/fireunit.js&quot; type=&quot;application/x-javascript&quot;/&gt; 
+    &lt;script src=&quot;chrome://fireunit/content/jsdiff.js&quot; type=&quot;application/x-javascript&quot;/&gt; 
 
+    &lt;stringbundleset id=&quot;stringbundleset&quot;&gt;
+        &lt;stringbundle id=&quot;strings_fireUnit&quot; src=&quot;chrome://fireunit/locale/fireunit.properties&quot;/&gt;
+    &lt;/stringbundleset&gt;
+    
     &lt;commandset id=&quot;mainCommandSet&quot;&gt; 
         &lt;command id=&quot;cmd_hwReRunTests&quot; oncommand=&quot;Firebug.FireUnitModel.onReRunTests(FirebugContext)&quot;/&gt;
     &lt;/commandset&gt; </diff>
      <filename>chrome/content/fireunit/fireunit.xul</filename>
    </modified>
    <modified>
      <diff>@@ -23,8 +23,11 @@ function set_d_val(td) {
 
 function checkText( str, msg ) {
 	var divs = fireunit.panel(&quot;console&quot;).getElementsByTagName(&quot;div&quot;);
-	var result = divs[ divs.length - 1 ].innerHTML;
-	fireunit.reCompare( str, result, msg );
+    fireunit.ok( divs.length &gt; 0, msg + &quot; &quot; + str);
+    if (divs.length) {
+	    var result = divs[ divs.length - 1 ].innerHTML;
+	    fireunit.reCompare( str, result, msg );
+	}
 }
 
 function clear(){
@@ -116,30 +119,32 @@ window.onload = function(){
 		clear();
 
 		// DOM Elements
-		fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[0]&quot; );
-		fireunit.key( &quot;fbCommandLine&quot;, 13 );
-		checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
+		fireunit.test(&quot;DOM Elements&quot;, function(){
+			fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[0]&quot; );
+			fireunit.key( &quot;fbCommandLine&quot;, 13 );
+			checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
 
-		fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[1]&quot; );
-		fireunit.key( &quot;fbCommandLine&quot;, 13 );
-		checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;first&lt;/span&gt;&quot;&amp;nbsp;classname=&quot;&lt;span class=&quot;nodeValue&quot;&gt;test&lt;/span&gt;&quot;&amp;nbsp;style=&quot;&lt;span class=&quot;nodeValue&quot;&gt;color: red;&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
+			fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[1]&quot; );
+			fireunit.key( &quot;fbCommandLine&quot;, 13 );
+			checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;first&lt;/span&gt;&quot;&amp;nbsp;classname=&quot;&lt;span class=&quot;nodeValue&quot;&gt;test&lt;/span&gt;&quot;&amp;nbsp;style=&quot;&lt;span class=&quot;nodeValue&quot;&gt;color: red;&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
 
-		fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[1]&quot; );
-		fireunit.key( &quot;fbCommandLine&quot;, 13 );
-		checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;first&lt;/span&gt;&quot;&amp;nbsp;classname=&quot;&lt;span class=&quot;nodeValue&quot;&gt;test&lt;/span&gt;&quot;&amp;nbsp;style=&quot;&lt;span class=&quot;nodeValue&quot;&gt;color: red;&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
+			fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[1]&quot; );
+			fireunit.key( &quot;fbCommandLine&quot;, 13 );
+			checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;first&lt;/span&gt;&quot;&amp;nbsp;classname=&quot;&lt;span class=&quot;nodeValue&quot;&gt;test&lt;/span&gt;&quot;&amp;nbsp;style=&quot;&lt;span class=&quot;nodeValue&quot;&gt;color: red;&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
 
-		fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[2]&quot; );
-		fireunit.key( &quot;fbCommandLine&quot;, 13 );
-setTimeout(function(){
-		checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;last&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
+			fireunit.value( &quot;fbCommandLine&quot;, &quot;document.getElementsByTagName('div')[2]&quot; );
+			fireunit.key( &quot;fbCommandLine&quot;, 13 );
+			checkText( '&lt;a class=&quot;objectLink objectLink-element&quot;&gt;&amp;lt;&lt;span class=&quot;nodeTag&quot;&gt;div&lt;/span&gt;&amp;nbsp;id=&quot;&lt;span class=&quot;nodeValue&quot;&gt;last&lt;/span&gt;&quot;&amp;gt;&lt;/a&gt;', &quot;DOM Element verified.&quot; );
 
-}, 100);
-		clear();
+			clear();
+		});
 
 		// Trigger large console
 		//fireunit.type( &quot;fbCommandLine&quot;, &quot;alert('test');\n&quot; );
 
-		Application.prefs.setValue(&quot;extensions.firebug.throttleMessages&quot;, oldThrottle);
+		fireunit.queue(function(){
+			Application.prefs.setValue(&quot;extensions.firebug.throttleMessages&quot;, oldThrottle);
+		});
 	}, 500);
 };
 &lt;/script&gt;</diff>
      <filename>chrome/content/fireunit/test/commandline.html</filename>
    </modified>
    <modified>
      <diff>@@ -3,8 +3,8 @@
 &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
 &lt;head&gt;
 &lt;script&gt;
-fireunit.ok( true, &quot;A true test, on page 1.&quot; );
-fireunit.ok( false, &quot;A false test, on page 1.&quot; );
+//fireunit.ok( true, &quot;A true test, on page 1.&quot; );
+//fireunit.ok( false, &quot;A false test, on page 1.&quot; );
 setTimeout(function(){
 	fireunit.testDone();
 }, 5000);</diff>
      <filename>chrome/content/fireunit/test/net/net1.html</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,13 @@
 &lt;head&gt;
 &lt;script&gt;
 if ( fireunit.forceHttp() ) {
-  fireunit.runTests( &quot;net1.html&quot;, &quot;net2.html&quot; );
+  fireunit.runTests( 
+    &quot;issue176.html&quot;,        // Filter for Flash requests
+    &quot;issue601.html&quot;,        // Response Tab
+    &quot;issue1256.html&quot;,       // Params Tab
+    &quot;issue372.html&quot;,        // Post Tab
+    &quot;issue700.html&quot;         // HTML Tab
+  );
 }
 &lt;/script&gt;
 &lt;/head&gt;</diff>
      <filename>chrome/content/fireunit/test/net/start.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,5 @@
 pref(&quot;extensions.firebug.fireunit.showPass&quot;, true);
 pref(&quot;extensions.firebug.fireunit.showFail&quot;, true);
+
+// Support for tracing console
+pref(&quot;extensions.firebug.DBG_FIREUNIT&quot;, false);</diff>
      <filename>defaults/preferences/prefs.js</filename>
    </modified>
    <modified>
      <diff>@@ -5,14 +5,14 @@
 
   &lt;Description about=&quot;urn:mozilla:install-manifest&quot;&gt;
     &lt;em:id&gt;fireunit@mozilla.com&lt;/em:id&gt;
-    &lt;em:version&gt;0.0.1&lt;/em:version&gt;
+    &lt;em:version&gt;0.0.4&lt;/em:version&gt;
    
     &lt;!-- Firefox --&gt;
     &lt;em:targetApplication&gt;
       &lt;Description&gt;
         &lt;em:id&gt;{ec8030f7-c20a-464f-9b0e-13a3a9e97384}&lt;/em:id&gt;
         &lt;em:minVersion&gt;2.0&lt;/em:minVersion&gt;
-        &lt;em:maxVersion&gt;3.0.*&lt;/em:maxVersion&gt;
+        &lt;em:maxVersion&gt;3.1.*&lt;/em:maxVersion&gt;
       &lt;/Description&gt;
     &lt;/em:targetApplication&gt;
 </diff>
      <filename>install.rdf</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>d1ea9166bf91a4a1394d87d8270870b6d2fc0cfb</id>
    </parent>
  </parents>
  <author>
    <name>John Resig</name>
    <email>jeresig@gmail.com</email>
  </author>
  <url>http://github.com/jeresig/fireunit/commit/06188755eec5cc516abafd800bfb3898addae228</url>
  <id>06188755eec5cc516abafd800bfb3898addae228</id>
  <committed-date>2008-12-02T05:04:02-08:00</committed-date>
  <authored-date>2008-12-02T05:04:02-08:00</authored-date>
  <message>Landing Honza's overhaul of the FireUnit UI (and a number of tests for various bugs).</message>
  <tree>67723728aff50623c922131bce8439cb9296ab58</tree>
  <committer>
    <name>John Resig</name>
    <email>jeresig@gmail.com</email>
  </committer>
</commit>
