Bug 395466 Checking in patch by Ben_H for QA Extension
authorctalbert@mozilla.com
Mon, 10 Sep 2007 15:01:06 -0700
changeset 5843 79e8c861a0dd70389b8ea77092fbff989b24cd2f
parent 5842 b494ef9c22a5a9df1cbf5ac42b36fe32177eb013
child 5844 b3bbfcc4f9a02aae2e1bbf5c6f136d4ca44e625c
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs395466
milestone1.9a8pre
Bug 395466 Checking in patch by Ben_H for QA Extension
testing/extensions/community/README
testing/extensions/community/build.xml
testing/extensions/community/chrome.manifest
testing/extensions/community/chrome/content/accountcreate.js
testing/extensions/community/chrome/content/accountcreate.xul
testing/extensions/community/chrome/content/browserOverlays.xul
testing/extensions/community/chrome/content/common.js
testing/extensions/community/chrome/content/litmus.js
testing/extensions/community/chrome/content/litmusReporter.js
testing/extensions/community/chrome/content/notifications.js
testing/extensions/community/chrome/content/prefs.js
testing/extensions/community/chrome/content/qa.js
testing/extensions/community/chrome/content/qa.xul
testing/extensions/community/chrome/content/settings.js
testing/extensions/community/chrome/content/setup.xul
testing/extensions/community/chrome/content/tabs/bugAccess.js
testing/extensions/community/chrome/content/tabs/bugzilla.js
testing/extensions/community/chrome/content/tabs/bugzilla.xul
testing/extensions/community/chrome/content/tabs/chat.xul
testing/extensions/community/chrome/content/tabs/help.xul
testing/extensions/community/chrome/content/tabs/litmus.xul
testing/extensions/community/chrome/content/tabs/qmo.js
testing/extensions/community/chrome/content/tabs/qmo.xul
testing/extensions/community/chrome/content/tabs/selecttests.js
testing/extensions/community/chrome/content/tabs/selecttests.xul
testing/extensions/community/chrome/content/tabs/settings.xul
testing/extensions/community/chrome/locale/en-US/qa.dtd
testing/extensions/community/chrome/locale/en-US/qa.properties
testing/extensions/community/chrome/locale/en-US/urls.properties
testing/extensions/community/chrome/skin/browserOverlays.css
testing/extensions/community/chrome/skin/highlight-end.png
testing/extensions/community/chrome/skin/highlight-hover-end.png
testing/extensions/community/chrome/skin/highlight-hover-mid.png
testing/extensions/community/chrome/skin/highlight-hover-start.png
testing/extensions/community/chrome/skin/highlight-mid.png
testing/extensions/community/chrome/skin/highlight-start.png
testing/extensions/community/chrome/skin/qa.css
testing/extensions/community/defaults/preferences/qa.js
testing/extensions/community/install.rdf
testing/extensions/community/jar-chrome.manifest
testing/extensions/community/platform/Darwin/chrome/skin/platform.css
testing/extensions/community/platform/WINNT/chrome/skin/platform.css
--- a/testing/extensions/community/README
+++ b/testing/extensions/community/README
@@ -3,9 +3,9 @@ Maintained by: Zach Lipton <zach@zachlip
 
 For more details, please see the wiki at: 
     http://wiki.mozilla.org/Litmus:Extension
     
 License is MPL 1.1/GPL 2.0/LGPL 2.1 tri-license as described 
 in the various srouce files. MochiKit (c) 2005 Bob Ippolito, 
 Academic Free License. Chatzilla (used under MPL/GPL) is 
 modified slightly to run in a different chrome path to not 
-conflict with standard installations.
\ No newline at end of file
+conflict with standard installations.
--- a/testing/extensions/community/build.xml
+++ b/testing/extensions/community/build.xml
@@ -1,33 +1,32 @@
 <?xml version="1.0"?>
 
-<!-- 
-build.xml adapted from Shawn Wilsher's rtse 
+<!--
+build.xml adapted from Shawn Wilsher's rtse
 (http://shawnwilsher.com/extensions/rtse/)
  -->
 
-
 <project name="qa" default="createxpi">
   <tstamp>
     <format property="build.number" pattern="yyyyMMdd" offset="-1" unit="hour"/>
   </tstamp>
   <property name="build.version" value="0.1.${build.number}"/>
-	<target name="createxpi" depends="createjar">
-		<zip destfile="qa.xpi">
-			<zipfileset dir="" includes="chrome/qa.jar"/>
-			<zipfileset dir="" includes="chatzilla.jar"/>
-			<zipfileset dir="" includes="install.rdf"/>
-			<zipfileset dir="" includes="jar-chrome.manifest" fullpath="chrome.manifest"/>
-			<zipfileset dir="" includes="README" />
-			<zipfileset dir="" includes="defaults/**" excludes="**CVS"/>
-			<zipfileset dir="" includes="platform/**" excludes="**CVS"/>
-			<zipfileset dir="" includes="components/chatzilla-service.js" />
- 		</zip>
- 	</target>
-	<target name="createjar">
+  <target name="createxpi" depends="createjar">
+    <zip destfile="qa.xpi">
+      <zipfileset dir="" includes="chrome/qa.jar"/>
+      <zipfileset dir="" includes="chatzilla.jar"/>
+      <zipfileset dir="" includes="install.rdf"/>
+      <zipfileset dir="" includes="jar-chrome.manifest" fullpath="chrome.manifest"/>
+      <zipfileset dir="" includes="README" />
+      <zipfileset dir="" includes="defaults/**" excludes="**CVS"/>
+      <zipfileset dir="" includes="platform/**" excludes="**CVS"/>
+      <zipfileset dir="" includes="components/chatzilla-service.js" />
+    </zip>
+  </target>
+  <target name="createjar">
     <zip destfile="chrome/qa.jar">
       <zipfileset dir="chrome" includes="content/**" excludes="**CVS"/>
       <zipfileset dir="chrome" includes="skin/**" excludes="**CVS"/>
       <zipfileset dir="chrome" includes="locale/**" excludes="**CVS"/>
-  	</zip>
+    </zip>
   </target>
 </project>
--- a/testing/extensions/community/chrome.manifest
+++ b/testing/extensions/community/chrome.manifest
@@ -1,10 +1,10 @@
-content	qa	chrome/content/
-skin	qa	classic/1.0	chrome/skin/
-locale	qa	en-US	chrome/locale/en-US/
+content  qa  chrome/content/
+skin  qa  classic/1.0	chrome/skin/
+locale  qa  en-US chrome/locale/en-US/
 
 overlay chrome://browser/content/browser.xul chrome://qa/content/browserOverlays.xul
 
 content chatzilla_qa jar:chatzilla.jar!/content/chatzilla/
 skin chatzilla_qa modern/1.0 jar:chatzilla.jar!/skin/modern/chatzilla/
 locale chatzilla_qa en-US jar:chatzilla.jar!/locale/en-US/chatzilla/
-content chatzillaservice_qa components/chatzilla-service.js
\ No newline at end of file
+content chatzillaservice_qa components/chatzilla-service.js
--- a/testing/extensions/community/chrome/content/accountcreate.js
+++ b/testing/extensions/community/chrome/content/accountcreate.js
@@ -1,108 +1,80 @@
-<!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is Zach Lipton.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Ben Hsieh <ben.hsieh@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
-
-var accountCreate = {
-    oldPassword: null,    //TODO: is this secure?
-    oldUsername: null,
-    updateFunction : null,
-	loadSetup : function() {
-		document.getElementById('qa-setup-createaccount-iframe').src = 
-		litmus.baseURL+'extension.cgi?createAccount=1';
-        accountCreate.updateFunction = window.arguments[0];
-        
-        accountCreate.oldPassword = qaPref.litmus.getPassword();
-        accountCreate.oldUsername = qaPref.litmus.getUsername();
-	},
-    validateAccount : function() {
-			// we're creating a new account, so get the uname and passwd 
-			// from the account created page:
-			var page = document.getElementById('qa-setup-createaccount-iframe').
-						contentDocument;
-			if (!page) {
-				alert("create account page is missing");
-				return false;
-			}
-			if (page.wrappedJSObject == null)
-				page.wrappedJSObject = page;
-			if (page.forms[0] && page.forms[0].wrappedJSObject == null)
-				page.forms[0].wrappedJSObject = page.forms[0];
-			
-			if (page.location == litmus.baseURL+'extension.cgi?createAccount=1'
-			    && qaSetup.didSubmitForm==0) {
-				page.forms[0].wrappedJSObject.submit();
-				qaSetup.didSubmitForm = 1;
-				setTimeout("qaSetup.validateAccount()", 5000);
-				return false;
-			}
-			if (qaSetup.didSubmitForm == 1 && ! page.forms || 
-			   ! page.forms[0].wrappedJSObject || 
-			   ! page.forms[0].wrappedJSObject.email && 
-			   ! page.forms[0].wrappedJSObject.email.value)  
-			   		{qaSetup.didSubmitForm = 2;
-			   		setTimeout("qaSetup.validateAccount()", 4000);
-			   		return false;}
-			var e = '';
-			var p = '';
-			if (page.forms && page.forms[0].wrappedJSObject && 
-			    page.forms[0].wrappedJSObject.email && 
-				page.forms[0].wrappedJSObject.email.value) 
-				{ e=page.forms[0].wrappedJSObject.email.value }
-			if (page.forms && page.forms[0].wrappedJSObject && 
-			    page.forms[0].wrappedJSObject.password && 
-				page.forms[0].wrappedJSObject.password.value) 
-				{ p=page.forms[0].wrappedJSObject.password.value }
-        // e is account, p is password
-		
-		var uname = e;
-		var passwd = p;
-		
-
-        if (e == '' || p == '') {
-            alert("No username or password has been registered.");
-            return false;    //we need better error handling.
-        }
-        qaPref.litmus.setPassword(uname, passwd);
-        accountCreate.updateFunction();
-                
-        // TODO: ideally we would validate against litmus, but...
-		return true;
-	},
-    
-    handleCancel : function() {
-        qaPref.litmus.setPassword(oldUsername, oldPassword);
-    }
-}
+<!-- -*- Mode: HTML -*-
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Ben Hsieh <ben.hsieh@gmail.com>
+ *
+ *  Portions taken from David Hamp-Gonsalves' Buggybar (buggybar@gmail.com)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+var accountCreate = {
+    oldPassword: null,    //TODO: is this secure?
+    oldUsername: null,
+    updateFunction : null,
+  loadSetup : function() {
+    document.getElementById('qa-settings-createaccount-frame').src =
+    litmus.baseURL+'extension.cgi?createAccount=1';
+        accountCreate.updateFunction = window.arguments[0];
+
+        accountCreate.oldPassword = qaPref.litmus.getPassword();
+        accountCreate.oldUsername = qaPref.litmus.getUsername();
+  },
+    validateAccount : function() {
+
+    var account = qaSetup.retrieveAccount("qa-settings-createaccount-frame");
+    var uname = account.name;
+    var passwd = account.password;
+
+
+        if (uname == '' || passwd == '') {
+            alert("No username or password has been registered.");
+            return false;    //we need better error handling.
+        }
+
+    var location = document.getElementById('qa-settings-createaccount-frame').contentDocument.location + "";
+    if (location.indexOf("createAccount") != -1) {
+      alert("Account not created! You most likely need to click the 'Create Account' button");
+      return false;
+    }
+
+        qaPref.litmus.setPassword(uname, passwd);
+        accountCreate.updateFunction();
+
+      // TODO: ideally we would validate against litmus, but...
+    return true;
+  },
+
+    handleCancel : function() {
+        qaPref.litmus.setPassword(oldUsername, oldPassword);
+    }
+}
--- a/testing/extensions/community/chrome/content/accountcreate.xul
+++ b/testing/extensions/community/chrome/content/accountcreate.xul
@@ -1,69 +1,69 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is Zach Lipton.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Ben Hsieh <ben.hsieh@gmail.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
-<!DOCTYPE wizard PUBLIC "-//MOZILLA//DTD XUL V1.0//EN" "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://qa/skin/" type="text/css"?>
-
-<dialog id="account-setup"
-        title="Account Creation"
-        class="color-dialog"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        xmlns:html="http://www.w3.org/1999/xhtml"
-        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-        width="800px"
-        height="400px"
-        onload="accountCreate.loadSetup();"
-        ondialogaccept="return accountCreate.validateAccount();"
-        ondialogcancel=""
-        >
-<script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
-<script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
-<script type="application/x-javascript" src="chrome://qa/content/common.js" />
-<script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
-<script type="application/x-javascript" src="chrome://qa/content/settings.js" />
-<script type="application/x-javascript" src="chrome://qa/content/accountcreate.js" />
-
-<stringbundleset id="stringbundleset">
-  <stringbundle id="bundle_qa" src="chrome://qa/locale/qa.properties" />
-</stringbundleset>
-
-    <vbox id="qa-setup-accountno" style="display: none" width="0px" height="0px" />
-    <html:iframe id="qa-setup-createaccount-iframe"
-        height="280"/>
-    
-</dialog>
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+- ***** BEGIN LICENSE BLOCK *****
+- Version: MPL 1.1/GPL 2.0/LGPL 2.1
+-
+- The contents of this file are subject to the Mozilla Public License Version
+- 1.1 (the "License"); you may not use this file except in compliance with
+- the License. You may obtain a copy of the License at
+- http://www.mozilla.org/MPL/
+-
+- Software distributed under the License is distributed on an "AS IS" basis,
+- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+- for the specific language governing rights and limitations under the
+- License.
+-
+- The Original Code is the Mozilla Community QA Extension
+-
+- The Initial Developer of the Original Code is the Mozilla Corporation.
+- Portions created by the Initial Developer are Copyright (C) 2007
+- the Initial Developer. All Rights Reserved.
+-
+- Contributor(s):
+-   Ben Hsieh <ben.hsieh@gmail.com>
+-
+- Alternatively, the contents of this file may be used under the terms of
+- either the GNU General Public License Version 2 or later (the "GPL"), or
+- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+- in which case the provisions of the GPL or the LGPL are applicable instead
+- of those above. If you wish to allow use of your version of this file only
+- under the terms of either the GPL or the LGPL, and not to allow others to
+- use your version of this file under the terms of the MPL, indicate your
+- decision by deleting the provisions above and replace them with the notice
+- and other provisions required by the LGPL or the GPL. If you do not delete
+- the provisions above, a recipient may use your version of this file under
+- the terms of any one of the MPL, the GPL or the LGPL.
+-
+- ***** END LICENSE BLOCK ***** -->
+<!DOCTYPE wizard PUBLIC "-//MOZILLA//DTD XUL V1.0//EN" "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://qa/skin/" type="text/css"?>
+
+<dialog id="account-setup"
+        title="Account Creation"
+        class="color-dialog"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        xmlns:html="http://www.w3.org/1999/xhtml"
+        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+        width="800px"
+        height="400px"
+        onload="accountCreate.loadSetup();"
+        ondialogaccept="return accountCreate.validateAccount();"
+        ondialogcancel=""
+        >
+<script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
+<script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
+<script type="application/x-javascript" src="chrome://qa/content/common.js" />
+<script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
+<script type="application/x-javascript" src="chrome://qa/content/settings.js" />
+<script type="application/x-javascript" src="chrome://qa/content/accountcreate.js" />
+
+<stringbundleset id="stringbundleset">
+  <stringbundle id="bundle_qa" src="chrome://qa/locale/qa.properties" />
+</stringbundleset>
+
+    <vbox id="qa-setup-accountno" style="display: none" width="0px" height="0px" />
+    <html:iframe id="qa-settings-createaccount-frame"
+        height="280"/>
+
+</dialog>
--- a/testing/extensions/community/chrome/content/browserOverlays.xul
+++ b/testing/extensions/community/chrome/content/browserOverlays.xul
@@ -1,89 +1,87 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+- ***** BEGIN LICENSE BLOCK *****
+- Version: MPL 1.1/GPL 2.0/LGPL 2.1
+-
+- The contents of this file are subject to the Mozilla Public License Version
+- 1.1 (the "License"); you may not use this file except in compliance with
+- the License. You may obtain a copy of the License at
+- http://www.mozilla.org/MPL/
+-
+- Software distributed under the License is distributed on an "AS IS" basis,
+- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+- for the specific language governing rights and limitations under the
+- License.
+-
+- The Original Code is the Mozilla Community QA Extension
+-
+- The Initial Developer of the Original Code is the Mozilla Corporation.
+- Portions created by the Initial Developer are Copyright (C) 2007
+- the Initial Developer. All Rights Reserved.
+-
+- Contributor(s):
+-   Zach Lipton <zach@zachlipton.com>
+-   Ben Hsieh <ben.hsieh@gmail.com>
+-
+- Alternatively, the contents of this file may be used under the terms of
+- either the GNU General Public License Version 2 or later (the "GPL"), or
+- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+- in which case the provisions of the GPL or the LGPL are applicable instead
+- of those above. If you wish to allow use of your version of this file only
+- under the terms of either the GPL or the LGPL, and not to allow others to
+- use your version of this file under the terms of the MPL, indicate your
+- decision by deleting the provisions above and replace them with the notice
+- and other provisions required by the LGPL or the GPL. If you do not delete
+- the provisions above, a recipient may use your version of this file under
+- the terms of any one of the MPL, the GPL or the LGPL.
+-
+- ***** END LICENSE BLOCK ***** -->
 
 <?xml-stylesheet href="chrome://qa/skin/browserOverlays.css" type="text/css"?>
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa" 
+<overlay id="qa"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
+
  <script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
  <script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
  <script type="application/x-javascript" src="chrome://qa/content/qa.js" />
  <script type="application/x-javascript" src="chrome://qa/content/notifications.js" />
- 
+
  <statusbar id="status-bar">
-  <statusbarpanel class="statusbarpanel-iconic" id="qa-statusbar-overlay" 
-  	src="chrome://qa/skin/qmo-16px.png" 
-  	onclick="qaMain.openQATool();" />
+ <statusbarpanel class="statusbarpanel-iconic" id="qa-statusbar-overlay"
+                 onclick="qaMain.openQATool();" />
  </statusbar>
- 
+
  <window id="main-window">
    <vbox id="qa-notify" class="qa-notify" hidden="true">
      <vbox flex="1" class="qa-notify">
        <hbox pack="end" align="center">
          <toolbarbutton class="tabs-closebutton" id="qa-notify-close"
            oncommand="qaNotifications.showHideNotify(false);" />
        </hbox>
        <vbox id="qa-notify-box">
        <vbox>
          <label id="qa-notify-inprogress" value="&qa.notification.inprogress;" />
          <hbox align="center" id="qa-notify-header-box" style="overflow: hidden">
            <label id="qa-notify-header" value="" />
-         </hbox>  
+         </hbox>
          <vbox id="qa-notify-event" style="display: none;">
            <label id="qa-notify-event-datetime" value="" />
            <label id="qa-notify-event-place" value="" />
          </vbox>
          <vbox id="qa-notify-content">
            <description id="qa-notify-text" />
-           <label id="qa-notify-infolink" class="text-link" href="" 
-             	value="" />
-             <label id="qa-notify-getstartedlink" class="text-link" href="" 
-             	value="" style="display: none;" />
-         </vbox> 
+           <label id="qa-notify-infolink" class="text-link" href=""
+                  value="" />
+             <label id="qa-notify-getstartedlink" class="text-link" href=""
+                    value="" style="display: none;" />
          </vbox>
-       </vbox>  
+         </vbox>
+       </vbox>
      </vbox>
    </vbox>
  </window>
- 
- 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/common.js
+++ b/testing/extensions/community/chrome/content/common.js
@@ -16,16 +16,18 @@
  * The Initial Developer of the Original Code is the Mozilla Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2006
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *  Zach Lipton <zach@zachlipton.com>
  *  Ben Hsieh <ben.hsieh@gmail.com>
  *
+ *  Portions taken from David Hamp-Gonsalves' Buggybar (buggybar@gmail.com)
+ *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
@@ -36,139 +38,161 @@
  * ***** END LICENSE BLOCK ***** */
 
 
 const Ci = Components.interfaces;
 const Cc = Components.classes;
 const Cr = Components.results;
 
 var qaTools = {
-	// load a JSON doc into a menulist/menupopup
-	// takes the url to load, the menulist to populate, the name of the method 
-	// to use to get the name from the JSON doc, and the name of the method to 
-	// use to get the value from the JSON doc, plus an optional callback
-	loadJsonMenu : function(url, menulist, nameMethod, valueMethod, callback) {
-		var d = loadJSONDoc(url);
-		d.addErrback(function (err) { 
-        if (err instanceof CancelledError) { 
-          return; 
+  // load a JSON doc into a menulist/menupopup
+  // takes the url to load, the menulist to populate, the name of the method
+  // to use to get the name from the JSON doc, and the name of the method to
+  // use to get the value from the JSON doc, plus an optional callback
+  loadJsonMenu : function(url, menulist, nameMethod, valueMethod, callback) {
+    var d = loadJSONDoc(url);
+    d.addErrback(function (err) {
+        if (err instanceof CancelledError) {
+          return;
         }
-        alert(err);
+        dump(err);
       });
-	  d.addCallback(function(obj) {
-	      if (obj instanceof Array) {
-	          for (var i=0; i<obj.length; i++) {
-	              var item = obj[i];
-	              if (! item) { continue; }
-	              var newitem = menulist.appendItem(item[nameMethod], 
-	              									item[valueMethod]);
-	          }
-	      } else {
-	          var newitem = menulist.appendItem(obj[nameMethod], obj[valueMethod]);
-	      }
-	      // stash the JSON object in the userData attribute for 
-	      // later use (e.g. when filtering the list).
-	      newitem.userData = item;
-	      if (callback) {
-	      	callback();
-	      }
-	  });
-	},
-	fetchFeed : function(url, callback) {
-		var httpRequest = null;
-		function FeedResultListener() {}
-		FeedResultListener.prototype = {
-			handleResult : function(result) {
-				var feed = result.doc;
-				feed.QueryInterface(Ci.nsIFeed);
-				callback(feed);
-			},
-		};
-		
-		function infoReceived() {
-			var data = httpRequest.responseText;
-			var ioService = Cc['@mozilla.org/network/io-service;1']
-							   .getService(Ci.nsIIOService);
-			var uri = ioService.newURI(url, null, null);
-			if (data.length) {
-				var processor = Cc["@mozilla.org/feed-processor;1"]
-								   .createInstance(Ci.nsIFeedProcessor);
-				try {
-					processor.listener = new FeedResultListener;
-					processor.parseFromString(data, uri);
-				} catch(e) {
-					alert("Error parsing feed: " + e);
-				}
-			}
-		}
-		httpRequest = new XMLHttpRequest();
-		httpRequest.open("GET", url, true);
-		try {
-			httpRequest.onload = infoReceived;
-			httpRequest.send(null);
-		} catch(e) {
-			alert(e);
-		}
-	},
-	httpPostRequest : function (url, data, callback, errback) {
-		// do a xmlhttprequest sending data with the post method
-		var req = getXMLHttpRequest();
-		req.open("POST", url, true);
-	    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
-	    req.setRequestHeader("Content-length", data.length);
-	    req.setRequestHeader("Connection", "close");
-	    req = sendXMLHttpRequest(req, data);
-	    req.addErrback(errback);
-	    req.addCallback(callback);
-	},
-	showHideLoadingMessage : function(box, bool) {
-		if (bool == true) { // show
-			var loading = document.createElementNS("http://www.w3.org/1999/xhtml", "p");
-			loading.textContent = qaMain.bundle.getString("qa.extension.loading");
-			loading.setAttributeNS("http://www.w3.org/1999/xhtml", "class", "loading_message");
-			box.appendChild(loading);
-		} else { // hide
-			var elements = box.childNodes;
-			for (var i=0; i<elements.length; i++) {
-				if (elements[i] && elements[i].getAttributeNS && 
-				  elements[i].getAttributeNS(
-				  "http://www.w3.org/1999/xhtml", "class") == "loading_message") {
-					box.removeChild(elements[i]);
-					break;
-				}
-			}
-		}
-	},
+    d.addCallback(function(obj) {
+        if (obj instanceof Array) {
+            for (var i=0; i<obj.length; i++) {
+                var item = obj[i];
+                if (! item) { continue; }
+                var newitem = menulist.appendItem(item[nameMethod],
+                                  item[valueMethod]);
+            }
+        } else {
+            var newitem = menulist.appendItem(obj[nameMethod], obj[valueMethod]);
+        }
+        // stash the JSON object in the userData attribute for
+        // later use (e.g. when filtering the list).
+        newitem.userData = item;
+        if (callback) {
+          callback();
+        }
+    });
+  },
+  fetchFeed : function(url, callback) {
+    var httpRequest = null;
+    function FeedResultListener() {}
+    FeedResultListener.prototype = {
+      handleResult : function(result) {
+        var feed = result.doc;
+        feed.QueryInterface(Ci.nsIFeed);
+        callback(feed);
+      }
+    };
+
+    function infoReceived() {
+      var data = httpRequest.responseText;
+      var ioService = Cc['@mozilla.org/network/io-service;1']
+                 .getService(Ci.nsIIOService);
+      var uri = ioService.newURI(url, null, null);
+      if (data.length) {
+        var processor = Cc["@mozilla.org/feed-processor;1"]
+                   .createInstance(Ci.nsIFeedProcessor);
+        try {
+          processor.listener = new FeedResultListener;
+          processor.parseFromString(data, uri);
+        } catch(e) {
+          alert("Error parsing feed: " + e);
+        }
+      }
+    }
+    httpRequest = new XMLHttpRequest();
+    httpRequest.open("GET", url, true);
+    try {
+      httpRequest.onload = infoReceived;
+      httpRequest.send(null);
+    } catch(e) {
+      alert(e);
+    }
+  },
+  httpPostRequest : function (url, data, callback, errback) {
+    // do a xmlhttprequest sending data with the post method
+    var req = getXMLHttpRequest();
+    req.open("POST", url, true);
+      req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+      req.setRequestHeader("Content-length", data.length);
+      req.setRequestHeader("Connection", "close");
+      req = sendXMLHttpRequest(req, data);
+      req.addErrback(errback);
+      req.addCallback(callback);
+  },
+  showHideLoadingMessage : function(box, bool) {
+    if (bool == true) { // show
+      var loading = document.createElementNS("http://www.w3.org/1999/xhtml", "p");
+      loading.textContent = qaMain.bundle.getString("qa.extension.loading");
+      loading.setAttributeNS("http://www.w3.org/1999/xhtml",
+                             "class", "loading_message");
+      box.appendChild(loading);
+    } else { // hide
+      var elements = box.childNodes;
+      for (var i=0; i<elements.length; i++) {
+        if (elements[i] && elements[i].getAttributeNS &&
+          elements[i].getAttributeNS(
+          "http://www.w3.org/1999/xhtml", "class") == "loading_message") {
+          box.removeChild(elements[i]);
+          break;
+        }
+      }
+    }
+  },
     arrayify : function(obj) {
         if (obj instanceof Array) {
             return obj;
         }
         var newArray = new Array();
         newArray[0] = obj;
         return newArray;
     },
     writeSafeHTML : function(elementID, htmlstr) {
         document.getElementById(elementID).innerHTML = "";  //clear it.
         var gUnescapeHTML = Components.classes["@mozilla.org/feed-unescapehtml;1"].getService(Components.interfaces.nsIScriptableUnescapeHTML);
         var context = document.getElementById(elementID);
         var fragment = gUnescapeHTML.parseFragment(htmlstr, false, null, context);
         context.appendChild(fragment);
-        
+
     },
-    
+
     assignLinkHandlers : function(node) {
         var children = node.getElementsByTagName('a');
         for (var i = 0; i < children.length; i++)
            children[i].addEventListener("click", qaTools.handleLink, false);
     },
     assignLinkHandler : function(link) {
         link.addEventListener("click", qaTools.handleLink, false);
     },
     handleLink : function(event) {
         var url = this.href;
         var type = qaPref.getPref("browser.link.open_external", "int");
         var where = "tab";
         if (type == 2) where = "window";
-        
+
         openUILinkIn(url, where);
         event.preventDefault(); // prevent it from simply following the href
     },
+    makeUniqueArray : function(array) {
+        var RV = new Array();
+        for( var i = 0; i < array.length; i++ ) {
+            if( RV.indexOf(array[i]) < 0 ) { RV.push( array[i] ); }
+        }
+        return RV;
+    }
 };
+
+function getCleanText(inputText)
+{
+  inputText = inputText.replace(/&#64;/g,"@");
+  inputText = inputText.replace(/&quot;/g,"\"");
+  inputText = inputText.replace(/&lt;/g, "<");
+  inputText = inputText.replace(/&gt;/g, ">");
+  inputText = inputText.replace(/&amp;/g, "&");
+  inputText = inputText.replace(/<[^>]*>/g, "");
+  inputText = inputText.replace(/\s+/g, " ");
+  inputText = inputText.replace(/\n*/g, "");
+
+  return inputText;
+}
--- a/testing/extensions/community/chrome/content/litmus.js
+++ b/testing/extensions/community/chrome/content/litmus.js
@@ -14,17 +14,17 @@
  * The Original Code is the Mozilla Community QA Extension
  *
  * The Initial Developer of the Original Code is the Mozilla Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2007
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *  Zach Lipton <zach@zachlipton.com>
- *	Ben Hsieh <bhsieh@mozilla.com>
+ *  Ben Hsieh <bhsieh@mozilla.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -32,216 +32,216 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 
  const FIREFOX_ID = "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}";
- 
+
  var litmus = {
-	baseURL : qaPref.getPref(qaPref.prefBase+".litmus.url", "char"),
-	userStats : '',
-	
-	getTestcase : function(testcase_id, callback) {
+  baseURL : qaPref.getPref(qaPref.prefBase+".litmus.url", "char"),
+  userStats : '',
+
+  getTestcase : function(testcase_id, callback) {
         litmus.getLitmusJson(testcase_id, callback, "testcase_id=");
-	},
-	getSubgroup : function(subgroupID, callback) {
+  },
+  getSubgroup : function(subgroupID, callback) {
         litmus.getLitmusJson(subgroupID, callback, "subgroup_id=");
     },
     getTestgroup : function(testgroupID, callback) {
         litmus.getLitmusJson(testgroupID, callback, "testgroup_id=");
     },
     getTestrun : function(testrunID, callback) {
         litmus.getLitmusJson(testrunID, callback, "test_run_id=");
     },
     getTestruns : function(callback) {
-        var s = new Sysconfig(); 
+        var s = new Sysconfig();
         var branch = encodeURIComponent(s.branch);
         litmus.getLitmusJson("&product_name=Firefox&branch_name=" + branch,
                         callback, "test_runs_by_branch_product_name=1");
     },
     getLitmusJson : function(ID, callback, prefix) {
         var url = litmus.baseURL+'json.cgi?' + prefix + ID;
         var d = loadJSONDoc(url);
-		d.addBoth(function (res) { 
-			d.deferred = null;  
-			return res; 
-		});
-		d.addCallback(callback);
-		d.addErrback(function (err) { 
-            if (err instanceof CancelledError) { 
-                return; 
+    d.addBoth(function (res) {
+      d.deferred = null;
+      return res;
+    });
+    d.addCallback(callback);
+    d.addErrback(function (err) {
+            if (err instanceof CancelledError) {
+                return;
             }
-            alert(err);
+            dump(err);
         });
     },
-    
-    
+
+
     lastTestRunSummary : "",
     lastTestGroupSummary : "",
     lastSubgroupObject: null,    // these have to be objects to avoid the async call later.
     lastTestcaseObject: null,    // they are saved every time a subgroup or testcase is written to screen
     lastTestcaseIndex: null,
-    
+
     preDialogSubgroupObject: null,  // saved to be restored in case of Cancel()
     preDialogTestcaseObject: null,
-    
+
     dialogActive: false,            // we want to keep controls disabled, even if the selection changes.
-    
+
     storeSubgroup : function(subgroup) {
         litmus.lastSubgroupObject = subgroup;
     },
     storeTestcase : function(testcase) {
         litmus.lastTestcaseObject = testcase;
     },
-    
+
     handleDialog : function() {
         if ($("qa-testrun-label").value != "") {
             litmus.lastTestRunSummary = $("qa-testrun-label").value;
             litmus.lastTestGroupSummary = $("qa-testgroup-label").value;
             lastTestcaseIndex = $("testlist").selectedIndex;
         }
         litmus.preDialogueSubgroupObject = litmus.lastSubgroupObject;
         litmus.preDialogTestcaseObject = litmus.lastTestcaseObject;
         litmus.disableAll();
         litmus.dialogActive = true;
         var newWindow = window.openDialog('chrome://qa/content/tabs/selecttests.xul', '_blank', 'chrome,all,dialog=yes',
                                           litmus.readStateFromPref, litmus.handleDialogCancel, litmus.handleDialogOK);
     },
-    
+
     handleDialogCancel : function() {
         if (litmus.lastTestRunSummary == "") return;
-        
+
         // this code is v. similar to readStateFromPref, but without an async call.
         $("qa-testrun-label").value = litmus.lastTestRunSummary;
         $("qa-testgroup-label").value = litmus.lastTestGroupSummary;
         litmus.lastSubgroupObject = litmus.preDialogueSubgroupObject;
         litmus.lastTestcaseObject = litmus.preDialogTestcaseObject;
-        
+
         if (litmus.lastSubgroupObject != null)
             litmus.populatePreviewBox(litmus.lastSubgroupObject.testcases);
         if (litmus.lastTestcaseObject != null) {
             litmus.populateTestcase(litmus.lastTestcaseObject);
         }
         // set the selection without firing an event, which would cause async call
         $("testlist").setAttribute("suppressonselect", "true");
         $("testlist").selectedIndex = lastTestcaseIndex;
         $("testlist").setAttribute("suppressonselect", "false");
-        
+
         // rewrite the prefs
         litmus.writeStateToPref(litmus.lastTestRunSummary, litmus.lastTestGroupSummary,
                                 litmus.lastSubgroupObject.subgroup_id, lastTestcaseIndex);
-        
+
         litmus.dialogActive = false;
         litmus.undisableAll();
     },
-    
+
     handleDialogOK : function() {
         litmus.dialogActive = false;
         litmus.undisableAll();
     },
-    
-	validateLogin : function(uname, passwd, callback) {
-		var qs = queryString({ 
-		    validate_login: 1,
-	        username: uname,
-	        password: passwd
-	    });
-	    qaTools.httpPostRequest(litmus.baseURL+'json.cgi', qs, callback);
-	},
-	postResultXML : function(xml, callback, errback) {
-		var qs = queryString({ data: xml});
-		var fake_callback = function(resp) {
-			// only call callback() if we really had a sucuess. XML 
-			// processing errors should result in a call to errback()
-			if ((/^ok/i).exec(resp.responseText)) {
-				callback(resp);
-			} else {
-				errback(resp);
-			}
-		};
-		qaTools.httpPostRequest(litmus.baseURL+'process_test.cgi', 
-										    qs, fake_callback, errback);
-	},
-    
-    currentSubgroupID: null,	
-    
+
+  validateLogin : function(uname, passwd, callback) {
+    var qs = queryString({
+        validate_login: 1,
+          username: uname,
+          password: passwd
+      });
+      qaTools.httpPostRequest(litmus.baseURL+'json.cgi', qs, callback);
+  },
+  postResultXML : function(xml, callback, errback) {
+    var qs = queryString({ data: xml});
+    var fake_callback = function(resp) {
+      // only call callback() if we really had a sucuess. XML
+      // processing errors should result in a call to errback()
+      if ((/^ok/i).exec(resp.responseText)) {
+        callback(resp);
+      } else {
+        errback(resp);
+      }
+    };
+    qaTools.httpPostRequest(litmus.baseURL+'process_test.cgi',
+                        qs, fake_callback, errback);
+  },
+
+    currentSubgroupID: null,
+
     writeStateToPref : function(testrunSummary, testgroupSummary, subgroupID, index) {
         qaPref.setPref(qaPref.prefBase + ".currentTestcase.testrunSummary", testrunSummary, "char");
         qaPref.setPref(qaPref.prefBase + ".currentTestcase.testgroupSummary", testgroupSummary, "char");
         qaPref.setPref(qaPref.prefBase + ".currentTestcase.subgroupId", subgroupID, "int");
         qaPref.setPref(qaPref.prefBase + ".currentTestcase.testcaseIndex", index, "int");
     },
     readStateFromPref : function() {
         $("qa-testrun-label").value = qaPref.getPref(qaPref.prefBase + ".currentTestcase.testrunSummary", "char");
         $("qa-testgroup-label").value = qaPref.getPref(qaPref.prefBase + ".currentTestcase.testgroupSummary", "char");
         litmus.currentSubgroupID = qaPref.getPref(qaPref.prefBase + ".currentTestcase.subgroupId", "int");
         litmus.disableAll();
-        
+
         if (litmus.currentSubgroupID != 0)
             litmus.getSubgroup(litmus.currentSubgroupID, function(subgroup) {litmus.statePopulateFields(subgroup); litmus.undisableAll();});
     },
     loadStats : function() {
-    	// pull new user statistics from litmus
-    	var url = litmus.baseURL+'json.cgi?' + 'user_stats=' + qaPref.litmus.getUsername();
-    	var req = loadJSONDoc(url);
-    	req.addCallback(function(data) {
-    	  litmus.userStats = data;  
-    	  litmus.displayStats();
-    	});
+      // pull new user statistics from litmus
+      var url = litmus.baseURL+'json.cgi?' + 'user_stats=' + qaPref.litmus.getUsername();
+      var req = loadJSONDoc(url);
+      req.addCallback(function(data) {
+        litmus.userStats = data;
+        litmus.displayStats();
+      });
     },
     displayStats : function() {
-    	var statbox = $('qa-litmus-stats');
-    	if (litmus.userStats != '') {
-    		var statline = qaMain.bundle.getFormattedString('qa.extension.litmus.stats', 
-    			[litmus.userStats.week, litmus.userStats.month, litmus.userStats.alltime]);
-    		statbox.value = statline;
-    	}
+      var statbox = $('qa-litmus-stats');
+      if (litmus.userStats != '') {
+        var statline = qaMain.bundle.getFormattedString('qa.extension.litmus.stats',
+          [litmus.userStats.week, litmus.userStats.month, litmus.userStats.alltime]);
+        statbox.value = statline;
+      }
     },
     checkRadioButtons : function() {
         var menu = document.getElementById('testlist');
         if (menu.selectedIndex == -1) return;
         var disable = menu.selectedItem.firstChild.getAttribute("checked");
         document.getElementById("qa-testcase-result").disabled = disable;
     },
-    
+
     prevButton : function() {
         $("testlist").selectedIndex--;
     },
-	nextButton: function() {
-		// if they selected a result, then submit the result
-		if ($('qa-testcase-result').selectedItem) {
-			litmus.submitResult();
-		}
+  nextButton: function() {
+    // if they selected a result, then submit the result
+    if ($('qa-testcase-result').selectedItem) {
+      litmus.submitResult();
+    }
         $("testlist").selectedIndex++;
-	},
+  },
     handleSelect : function() {
         if ($("testlist").selectedIndex == -1)
             return;
-        
+
         litmus.disableAll();
         litmus.getTestcase($("testlist").selectedItem.value, function(testcase) {
-        	litmus.populateTestcase(testcase);
-        	$('qa-testcase-progress').value = 
-        		qaMain.bundle.getFormattedString('qa.extension.litmus.progress',
-        			[$("testlist").selectedIndex+1, $("testlist").getRowCount()]);
+          litmus.populateTestcase(testcase);
+          $('qa-testcase-progress').value =
+            qaMain.bundle.getFormattedString('qa.extension.litmus.progress',
+              [$("testlist").selectedIndex+1, $("testlist").getRowCount()]);
             litmus.undisableAll();
         });
     },
-	populatePreviewBox : function(testcases) {
-        
+  populatePreviewBox : function(testcases) {
+
         var menu = document.getElementById('testlist');
         if (!menu) return;
-        
+
         while (menu.firstChild) {  // clear menu
             menu.removeChild(menu.firstChild);
         };
-    
+
         for (var i = 0; i < testcases.length; i++) {
             var row = document.createElement("listitem");
             row.value = testcases[i].testcase_id;
             var checkbox = document.createElement("listcell");
             checkbox.setAttribute("label", "");
             checkbox.setAttribute("type", "checkbox");
             checkbox.setAttribute("disabled", "true");
             var name = document.createElement("listcell");
@@ -253,215 +253,226 @@
             menu.appendChild(row);
         }
     },
     populateTestcase : function(testcase) {
         litmus.lastTestcaseObject = testcase;
         if (testcase == undefined) {
                 return;
             }
-        document.getElementById('qa-testcase-id').value = 
+        document.getElementById('qa-testcase-id').value =
             qaMain.bundle.getString("qa.extension.testcase.head")+testcase.testcase_id;
-		document.getElementById('qa-testcase-summary').value = testcase.summary;
-	
+    document.getElementById('qa-testcase-summary').value = testcase.summary;
+
         qaTools.writeSafeHTML('qa-testcase-steps', testcase.steps_formatted);
         qaTools.writeSafeHTML('qa-testcase-expected', testcase.expected_results_formatted);
-        
+
         qaTools.assignLinkHandlers($('qa-testcase-steps'));
         qaTools.assignLinkHandlers($('qa-testcase-expected'));
-        
+
+        if (testcase.regression_bug_id) {
+            bugzilla.loadBug(testcase.regression_bug_id);
+        } else {
+            var bugarray = bugzilla.findBugzillaLinks($("qa-testcase-expected"));
+            if (bugarray.length) {
+               bugzilla.loadBug(bugarray[0]);
+               for (var i = 1; i < bugarray.length; i++) {
+                  bugzilla.loadBug(bugarray[i], true);
+               }
+            }
+        }
         litmus.checkRadioButtons();
     },
-	populateFields : function(subgroup) {
+  populateFields : function(subgroup) {
         litmus.lastSubgroupObject = subgroup;
-		litmus.populatePreviewBox(subgroup.testcases);
-		$('qa-subgroup-label').value = subgroup.name;
+    litmus.populatePreviewBox(subgroup.testcases);
+    $('qa-subgroup-label').value = subgroup.name;
         $("testlist").selectedIndex = 0;
     },
     statePopulateFields : function(subgroup) {  //TODO: there's gotta be a better way to do this...
         litmus.lastSubgroupObject = subgroup;
         litmus.populatePreviewBox(subgroup.testcases);
         $('qa-subgroup-label').value = subgroup.name;
-        
+
         $("testlist").selectedIndex = qaPref.getPref(qaPref.prefBase + ".currentTestcase.testcaseIndex", "int");
     },
     disableAll : function() {   //
         $("testlist").disabled = true;
         $("qa-testcase-result").disabled = true;
         $("qa-mainwindow-previousButton").disabled = true;
         $("qa-mainwindow-nextButton").disabled = true;
-        
+
     },
     undisableAll : function() {
          if(litmus.dialogActive) return;   // ignore all requests while there is a dialog open
-      
+
         $("testlist").disabled = false;
         $("qa-testcase-result").disabled = false;
         $("qa-mainwindow-previousButton").disabled = false;
         $("qa-mainwindow-nextButton").disabled = false;
-        
+
     },
-	submitResult : function() {
-		var rs;
-		var item = $('qa-testcase-result').selectedItem;
-		if (item.id == "qa-testcase-pass") {
-			rs = 'Pass';
-		} else if (item.id == "qa-testcase-fail") {
-			rs = 'Fail';
-		} else if (item.id == "qa-testcase-unclearBroken") {
-			rs = 'Test unclear/broken';
-		} else {
-			// no result selected, so don't submit anything for thes test:
-			return false;
-		}
+  submitResult : function() {
+    var rs;
+    var item = $('qa-testcase-result').selectedItem;
+    if (item.id == "qa-testcase-pass") {
+      rs = 'Pass';
+    } else if (item.id == "qa-testcase-fail") {
+      rs = 'Fail';
+    } else if (item.id == "qa-testcase-unclearBroken") {
+      rs = 'Test unclear/broken';
+    } else {
+      // no result selected, so don't submit anything for thes test:
+      return false;
+    }
 
         var menu = document.getElementById('testlist');
-        
-		var l = new LitmusResults({username: qaPref.litmus.getUsername(), 
-								  password: qaPref.litmus.getPassword(),
-								  server: litmus.baseURL});
-		l.sysconfig(new Sysconfig());
-		
-		l.addResult(new Result({
-			testid: menu.selectedItem.value,
-			resultstatus: rs,
-			exitstatus: 'Exited Normally',
-			duration: 0,
-			comment: $('qa-testcase-comment').value,
-			isAutomatedResult: 0
-		}));
-		
-		var callback = function(resp) {
-			// increment the stat counters:
-			for (var i in litmus.userStats) {
-				litmus.userStats[i]++;
-			}
-			litmus.displayStats();
-		};
-		
-		var errback = function(resp) {
-			alert(resp.responseText);
-		};
-		
-		litmus.postResultXML(l.toXML(), callback, errback);        
+
+    var l = new LitmusResults({username: qaPref.litmus.getUsername(),
+                  password: qaPref.litmus.getPassword(),
+                  server: litmus.baseURL});
+    l.sysconfig(new Sysconfig());
+
+    l.addResult(new Result({
+      testid: menu.selectedItem.value,
+      resultstatus: rs,
+      exitstatus: 'Exited Normally',
+      duration: 0,
+      comment: $('qa-testcase-comment').value,
+      isAutomatedResult: 0
+    }));
+
+    var callback = function(resp) {
+      // increment the stat counters:
+      for (var i in litmus.userStats) {
+        litmus.userStats[i]++;
+      }
+      litmus.displayStats();
+    };
+
+    var errback = function(resp) {
+      dump(resp.responseText);
+    };
+
+    litmus.postResultXML(l.toXML(), callback, errback);
         var item = menu.selectedItem;
         item.firstChild.setAttribute("checked", "true");
         return false;   // ?? Got rid of strict warning...
-    },
- };
+    }
+  };
+
+  // any missing fields will be autodetected
+  function Sysconfig(aProduct, aPlatform, aOpsys, aBranch, aBuildid, aLocale) {
+  this._load('product', aProduct);
+  this._load('platform', aPlatform);
+  this._load('opsys', aOpsys);
+  this._load('branch', aBranch);
+  this._load('buildid', aBuildid);
+  this._load('locale', aLocale);
+  this.populate();
+  }
+
+  Sysconfig.prototype = {
+  product: null,
+  platform: null,
+  opsys: null,
+  branch: null,
+  buildid: null,
+  locale: null,
 
-// any missing fields will be autodetected
-function Sysconfig(aProduct, aPlatform, aOpsys, aBranch, aBuildid, aLocale) {
-	this._load('product', aProduct);
-	this._load('platform', aPlatform);
-	this._load('opsys', aOpsys);
-	this._load('branch', aBranch);
-	this._load('buildid', aBuildid);
-	this._load('locale', aLocale);
-	this.populate();
-}
- 
-Sysconfig.prototype = {
-	product: null,
-	platform: null,
-	opsys: null,
-	branch: null,
-	buildid: null,
-	locale: null,
-	
-	// set a field according to the following priorities:
-	// 1. 'setting'
-	// 2. qa.extension.sysconfig.fieldname
-	// 3. null
-	_load: function(fieldname, setting) {
-		if (this[fieldname]) { return }
-		if (setting) {
-			this[fieldname] = setting;
-			return;
-		} 
-		var pref = qaPref.getPref(qaPref.prefBase+'.sysconfig.'+fieldname, 'char');
-		if (pref) {
-			this[fieldname] = pref;
-			return;
-		}
-	},
-	
-	// if something cannot be autodetected, an exception is thrown 
-	// with the name of the missing field
-	populate: function() {
-		var appinfo = Components.classes["@mozilla.org/xre/app-info;1"]
+  // set a field according to the following priorities:
+  // 1. 'setting'
+  // 2. qa.extension.sysconfig.fieldname
+  // 3. null
+  _load: function(fieldname, setting) {
+    if (this[fieldname]) { return }
+    if (setting) {
+      this[fieldname] = setting;
+      return;
+    }
+    var pref = qaPref.getPref(qaPref.prefBase+'.sysconfig.'+fieldname, 'char');
+    if (pref) {
+      this[fieldname] = pref;
+      return;
+    }
+  },
+
+  // if something cannot be autodetected, an exception is thrown
+  // with the name of the missing field
+  populate: function() {
+    var appinfo = Components.classes["@mozilla.org/xre/app-info;1"]
                         .getService(Components.interfaces.nsIXULAppInfo);
-                        
-        // build id:  
-		this.buildid = appinfo.appBuildID;
-		if (! this.buildid) { throw "buildid" }
-        
+
+        // build id:
+    this.buildid = appinfo.appBuildID;
+    if (! this.buildid) { throw "buildid" }
+
         // product:
         if (! this.product) {
-        	if (appinfo.ID == FIREFOX_ID) {
-        		this.product = 'Firefox';
-        	}
-        	if (! this.product) { throw "product" }
+          if (appinfo.ID == FIREFOX_ID) {
+            this.product = 'Firefox';
+          }
+          if (! this.product) { throw "product" }
         }
-        
+
         // branch:
-        // people switch branches, so we detect this even though it might 
+        // people switch branches, so we detect this even though it might
         // already be set in a pref
-		if ((/^3\.0/).exec(appinfo.version)) {
-			this.branch = '3.0 Branch';
-		} else if ((/^2\.0/).exec(appinfo.version)) {
-			this.branch = '2.0 Branch';
-		} else if ((/^1\.5\./).exec(appinfo.version)) {
-			this.branch = '1.5 Branch';
-		}
-		if (! this.branch) { throw "branch" }
-			
+    if ((/^3\.0/).exec(appinfo.version)) {
+      this.branch = '3.0 Branch';
+    } else if ((/^2\.0/).exec(appinfo.version)) {
+      this.branch = '2.0 Branch';
+    } else if ((/^1\.5\./).exec(appinfo.version)) {
+      this.branch = '1.5 Branch';
+    }
+    if (! this.branch) { throw "branch" }
+
         // platform:
         if (! this.platform) {
-			if ((/^MacPPC/).exec(navigator.platform)) {
-				this.platform = 'Mac (PPC)';
-			} else if ((/^MacIntel/).exec(navigator.platform)) {
-				this.platform = 'Mac (Intel)';
-			} else if ((/^Win/).exec(navigator.platform)) {
-				this.platform = 'Windows';
-			} else if ((/^Linux/).exec(navigator.platform)) {
-				this.platform = 'Linux';
-			} else if ((/^Solaris/).exec(navigator.platform)) {
-				this.platform = 'Solaris';
-			}
-			if (! this.platform) { throw "platform" }
+      if ((/^MacPPC/).exec(navigator.platform)) {
+        this.platform = 'Mac (PPC)';
+      } else if ((/^MacIntel/).exec(navigator.platform)) {
+        this.platform = 'Mac (Intel)';
+      } else if ((/^Win/).exec(navigator.platform)) {
+        this.platform = 'Windows';
+      } else if ((/^Linux/).exec(navigator.platform)) {
+        this.platform = 'Linux';
+      } else if ((/^Solaris/).exec(navigator.platform)) {
+        this.platform = 'Solaris';
+      }
+      if (! this.platform) { throw "platform" }
         }
         // opsys
         if (this.platform == 'Windows') {
-        	switch (navigator.oscpu) {
-        		case 'Windows NT 5.1':
-        			this.opsys = 'Windows XP';
-        			break;
-        		case 'Windows NT 5.2':
-        			this.opsys = 'Windows XP';
-        			break;
-        		case 'Windows NT 6.0':
-        			this.opsys = 'Windows Vista';
-        			break;
-        		case 'Windows NT 5.0':
-        			this.opsys = 'Windows 2000';
-        			break;
-        		case 'Win 9x 4.90':
-        			this.opsys = 'Windows ME';
-        			break;
-        		case 'Win98':
-        			this.opsys = 'Windows 98';
-        			break;
-        	}
+          switch (navigator.oscpu) {
+            case 'Windows NT 5.1':
+              this.opsys = 'Windows XP';
+              break;
+            case 'Windows NT 5.2':
+              this.opsys = 'Windows XP';
+              break;
+            case 'Windows NT 6.0':
+              this.opsys = 'Windows Vista';
+              break;
+            case 'Windows NT 5.0':
+              this.opsys = 'Windows 2000';
+              break;
+            case 'Win 9x 4.90':
+              this.opsys = 'Windows ME';
+              break;
+            case 'Win98':
+              this.opsys = 'Windows 98';
+              break;
+          }
         } else if (this.platform == 'Linux') {
-        	this.opsys = 'Linux';
+          this.opsys = 'Linux';
         } else if (this.platform == 'Mac (PPC)' || this.platform == 'Mac (Intel)') {
-        	// no way to detect the OS on mac, so just assume 
-        	// it's 10.4. The user can provide the real OS in setup
-        	this.opsys = 'Mac OS 10.4';
+          // no way to detect the OS on mac, so just assume
+          // it's 10.4. The user can provide the real OS in setup
+          this.opsys = 'Mac OS 10.4';
         }
         if (! this.opsys) {throw "opsys" }
-        
+
         // locale
-		this.locale = navigator.language;
-		if (!this.locale) { throw "locale" }
-	},
+    this.locale = navigator.language;
+    if (!this.locale) { throw "locale" }
+  }
 };
--- a/testing/extensions/community/chrome/content/litmusReporter.js
+++ b/testing/extensions/community/chrome/content/litmusReporter.js
@@ -1,241 +1,239 @@
-// ***** BEGIN LICENSE BLOCK *****
-// Version: MPL 1.1/GPL 2.0/LGPL 2.1
-//
-// The contents of this file are subject to the Mozilla Public License Version
-// 1.1 (the "License"); you may not use this file except in compliance with
-// the License. You may obtain a copy of the License at
-// http://www.mozilla.org/MPL/
-//
-// Software distributed under the License is distributed on an "AS IS" basis,
-// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-// for the specific language governing rights and limitations under the
-// License.
-//
-// The Original Code is Litmus.
-//
-// The Initial Developer of the Original Code is
-// The Mozilla Corporation.
-// Portions created by the Initial Developer are Copyright (C) 2006
-// the Initial Developer. All Rights Reserved.
-//
-// Contributor(s):
-//   Zach Lipton <zach@zachlipton.com> (Original author)
-//
-// Alternatively, the contents of this file may be used under the terms of
-// either the GNU General Public License Version 2 or later (the "GPL"), or
-// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-// in which case the provisions of the GPL or the LGPL are applicable instead
-// of those above. If you wish to allow use of your version of this file only
-// under the terms of either the GPL or the LGPL, and not to allow others to
-// use your version of this file under the terms of the MPL, indicate your
-// decision by deleting the provisions above and replace them with the notice
-// and other provisions required by the GPL or the LGPL. If you do not delete
-// the provisions above, a recipient may use your version of this file under
-// the terms of any one of the MPL, the GPL or the LGPL.
-//
-// ***** END LICENSE BLOCK *****
-
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Zach Lipton <zach@zachlipton.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+* ***** END LICENSE BLOCK ***** */
 // Generate XML result data and submit it to Litmus
 
-// Note that this is essentially a direct port of the Test::Litmus perl 
+// Note that this is essentially a direct port of the Test::Litmus perl
 // module. Please see http://search.cpan.org/~zlipton/Test-Litmus-0.03/lib/Test/Litmus.pm
-// for further information 
+// for further information
 
-// See also the Litmus Web Services Specification at 
+// See also the Litmus Web Services Specification at
 // http://wiki.mozilla.org/Litmus:Web_Services
 
 const VERSION = '0.0.2';
 
-/** 
+/**
  * Result constructor.
  *
- * @param machinename 
- *		  (optional)
- *		  The name of the machine running the tests
+ * @param machinename
+ *  (optional)
+ *  The name of the machine running the tests
  * @param username
- *		  Username of the account submitting results
+ *  Username of the account submitting results
  * @param password
  *        Authentication token to be sent to the Litmus server
  * @param server
  *        (optional)
- *		  The server to send results to
+ *  The server to send results to
 */
 function LitmusResults(a) {
-	this.machinename = a.machinename || '';
-	this.requireField('username', a);
-	this.requireField('password', a);
-	this.server = a.server || 'http://litmus.mozilla.org/process_test.cgi';
-	this.action = 'submit';
-	
-	this.results = new Array();
-	this.logs = new Array();
+  this.machinename = a.machinename || '';
+  this.requireField('username', a);
+  this.requireField('password', a);
+  this.server = a.server || 'http://litmus.mozilla.org/process_test.cgi';
+  this.action = 'submit';
+
+  this.results = new Array();
+  this.logs = new Array();
 }
 
 LitmusResults.prototype = {
-	// add fieldname to this unless it's missing, at which point we throw an 
-	// exception to the caller
-	requireField : function (name, args) {
-		if (args[name] === undefined) {
-			throw "Missing required field in Litmus result submission: "+name;
-		}
-		this[name] = args[name];
-	},
-	sysconfig : function (a) {
-		this.requireField('product', a);
-		this.requireField('platform', a);
-		this.requireField('opsys', a);
-		this.requireField('branch', a);
-		this.requireField('buildid', a);
-		this.requireField('locale', a);
-		this.buildtype = a.buildtype;
-	},
-	addLog : function(log) {
-		this.logs.push(log);
-	},
-	addResult : function(result) {
-		this.results.push(result);
-	},
-	toXML : function() {
-		var d = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'+"\n";
-		d += '<!DOCTYPE litmusresults PUBLIC' +  
+  // add fieldname to this unless it's missing, at which point we throw an
+  // exception to the caller
+  requireField : function (name, args) {
+    if (args[name] === undefined) {
+      throw "Missing required field in Litmus result submission: "+name;
+    }
+    this[name] = args[name];
+  },
+  sysconfig : function (a) {
+    this.requireField('product', a);
+    this.requireField('platform', a);
+    this.requireField('opsys', a);
+    this.requireField('branch', a);
+    this.requireField('buildid', a);
+    this.requireField('locale', a);
+    this.buildtype = a.buildtype;
+  },
+  addLog : function(log) {
+    this.logs.push(log);
+  },
+  addResult : function(result) {
+    this.results.push(result);
+  },
+  toXML : function() {
+    var d = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'+"\n";
+    d += '<!DOCTYPE litmusresults PUBLIC' +
                ' "-//Mozilla Corporation//Litmus Result Submission DTD//EN/"' +
                ' "http://litmus.mozilla.org/litmus_results.dtd">'+"\n";
-		d += '<litmusresults action="'+this.action+'" useragent="'+
-			'litmusReporter.js/'+VERSION+' ('+this.machinename+')" '+
-			(this.machinename ? 'machinename="'+this.machinename+'">' : '>') +"\n";
-		d += '  <testresults username="'+this.username+'"'+"\n";
-		d += '     authtoken="'+this.password+'"'+"\n";
-		d += '     product="'+this.product+'"'+"\n";
-		d += '     platform="'+this.platform+'"'+"\n";
-		d += '     opsys="'+this.opsys+'"'+"\n";
-		d += '     branch="'+this.branch+'"'+"\n";
-		d += '     buildid="'+this.buildid+'"'+"\n";
-		d += '     locale="'+this.locale+'"';
-		if (this.buildtype) {
-			d += "\n"+'     buildtype="'+this.buildtype+'"'+">\n";
-		} else {
-			d += ">\n";
-		}
-		if (this.logs) {
-			if (this.logs instanceof Array) {
-				for(var i=0; i<this.logs.length; i++) {
-					if (this.logs[i] instanceof Log) {
-						d += this.logs[i].toXML();
-					}
-				}
-			} else {
-				if (this.logs instanceof Log) {
-					d += this.logs.toXML();
-				}
-			}
-		}
-		if (this.results) {
-			for(var i=0; i<this.results.length; i++) {
-				d += this.results[i].toXML();
-			}
-		}
-		d += '  </testresults>'+"\n";
-    	d += '</litmusresults>'+"\n";
-		return d;
-	},
+    d += '<litmusresults action="'+this.action+'" useragent="'+
+      'litmusReporter.js/'+VERSION+' ('+this.machinename+')" '+
+      (this.machinename ? 'machinename="'+this.machinename+'">' : '>') +"\n";
+    d += '  <testresults username="'+this.username+'"'+"\n";
+    d += '     authtoken="'+this.password+'"'+"\n";
+    d += '     product="'+this.product+'"'+"\n";
+    d += '     platform="'+this.platform+'"'+"\n";
+    d += '     opsys="'+this.opsys+'"'+"\n";
+    d += '     branch="'+this.branch+'"'+"\n";
+    d += '     buildid="'+this.buildid+'"'+"\n";
+    d += '     locale="'+this.locale+'"';
+    if (this.buildtype) {
+      d += "\n"+'     buildtype="'+this.buildtype+'"'+">\n";
+    } else {
+      d += ">\n";
+    }
+    if (this.logs) {
+      if (this.logs instanceof Array) {
+        for(var i=0; i<this.logs.length; i++) {
+          if (this.logs[i] instanceof Log) {
+            d += this.logs[i].toXML();
+          }
+        }
+      } else {
+        if (this.logs instanceof Log) {
+          d += this.logs.toXML();
+        }
+      }
+    }
+    if (this.results) {
+      for(var i=0; i<this.results.length; i++) {
+        d += this.results[i].toXML();
+      }
+    }
+    d += '  </testresults>'+"\n";
+      d += '</litmusresults>'+"\n";
+    return d;
+  }
 };
 
-/** 
+/**
   * Log constructor.
   *
   * @param type
   *        The log type
   * @param data
   *        The log data to submit
 */
 function Log(a) {
-	this.requireField('type', a);
-	this.requireField('data', a);
+  this.requireField('type', a);
+  this.requireField('data', a);
 }
 
 Log.prototype = {
-	type: null,
-	data: null,
-	requireField : function (name, args) {
-		if (args[name] === undefined) {
-			throw "Missing required field in Litmus result submission: "+name;
-		}
-		this[name] = args[name];
-	},
-	toXML : function () {
-		var d = '<log logtype="'+this.type+'">'+"\n";
-		d += '  <![CDATA['+this.data+']]>'+"\n";
-		d += '</log>'+"\n";
-		return d;
-	},
+  type: null,
+  data: null,
+  requireField : function (name, args) {
+    if (args[name] === undefined) {
+      throw "Missing required field in Litmus result submission: "+name;
+    }
+    this[name] = args[name];
+  },
+  toXML : function () {
+    var d = '<log logtype="'+this.type+'">'+"\n";
+    d += '  <![CDATA['+this.data+']]>'+"\n";
+    d += '</log>'+"\n";
+    return d;
+  }
 };
-	
-/** 
+
+/**
   * Result constructor.
   *
 */
 function Result(a) {
-	this.requireField('testid', a);
-	this.requireField('resultstatus', a);
-	this.requireField('exitstatus', a);
-	this.requireField('duration', a);
-	
-	// if no timestamp specified, use the current time
-	if (a.timestamp) { this.timestamp = a.timestamp; }
-	else {
-		var d = new Date();
-		this.timestamp=''+d.getFullYear()+leadZero((d.getMonth()+1))+
-			leadZero(d.getDate())+leadZero(d.getHours())+leadZero(d.getMinutes())+
-			leadZero(d.getSeconds());
-	}
-	
-	this.comment = a.comment;
-	this.bugnumber = a.bugnumber;
-	this.logs = a.log;
-	this.automated = a.isAutomatedResult ? a.isAutomatedResult : 1;
-}
+  this.requireField('testid', a);
+  this.requireField('resultstatus', a);
+  this.requireField('exitstatus', a);
+  this.requireField('duration', a);
+
+  // if no timestamp specified, use the current time
+  if (a.timestamp) { this.timestamp = a.timestamp; }
+  else {
+    var d = new Date();
+    this.timestamp=''+d.getFullYear()+leadZero((d.getMonth()+1))+
+      leadZero(d.getDate())+leadZero(d.getHours())+leadZero(d.getMinutes())+
+      leadZero(d.getSeconds());
+  }
+
+  this.comment = a.comment;
+  this.bugnumber = a.bugnumber;
+  this.logs = a.log;
+  this.automated = a.isAutomatedResult ? a.isAutomatedResult : 1;
+  }
 
-Result.prototype = {
-	requireField : function (name, args) {
-		if (args[name] === undefined) {
-			throw "Missing required field in Litmus result submission: "+name;
-		}
-		this[name] = args[name];
-	},	
-	toXML : function() {
-		var d  = '<result testid="'+this.testid+'"'+"\n";
-		d += '		 is_automated_result="'+this.automated+'"'+"\n";
-		d += '      resultstatus="'+this.resultstatus+'"'+"\n";
-		d += '      exitstatus="'+this.exitstatus+'"'+"\n";
-		d += '      duration="'+this.duration+'"'+"\n";
-		d += '      timestamp="'+this.timestamp+'">'+"\n";
-		
-		if (this.comment) {
-			d += '  <comment>'+this.comment+'</comment>'+"\n";
-		}
-		
-		if (this.bugnumber) {
-			d += '  <bugnumber>'+this.bugnumber+'</bugnumber>'+"\n";
-		}
-		if (this.logs) {
-			if (this.logs instanceof Array) {
-				for(var i=0; i<this.logs.length; i++) {
-					if (this.logs[i] instanceof Log) {
-						d += this.logs[i].toXML();
-					}
-				}
-			} else {
-				if (this.logs instanceof Log) {
-					d += this.logs.toXML();
-				}
-			}
-		}
-		d += '</result>'+"\n";
-		return d;
-	},
+  Result.prototype = {
+  requireField : function (name, args) {
+    if (args[name] === undefined) {
+      throw "Missing required field in Litmus result submission: "+name;
+    }
+    this[name] = args[name];
+  },
+  toXML : function() {
+    var d  = '<result testid="'+this.testid+'"'+"\n";
+    d += '		 is_automated_result="'+this.automated+'"'+"\n";
+    d += '      resultstatus="'+this.resultstatus+'"'+"\n";
+    d += '      exitstatus="'+this.exitstatus+'"'+"\n";
+    d += '      duration="'+this.duration+'"'+"\n";
+    d += '      timestamp="'+this.timestamp+'">'+"\n";
+
+    if (this.comment) {
+      d += '  <comment>'+this.comment+'</comment>'+"\n";
+    }
+
+    if (this.bugnumber) {
+      d += '  <bugnumber>'+this.bugnumber+'</bugnumber>'+"\n";
+    }
+    if (this.logs) {
+      if (this.logs instanceof Array) {
+        for(var i=0; i<this.logs.length; i++) {
+          if (this.logs[i] instanceof Log) {
+            d += this.logs[i].toXML();
+          }
+        }
+      } else {
+        if (this.logs instanceof Log) {
+          d += this.logs.toXML();
+        }
+      }
+    }
+    d += '</result>'+"\n";
+    return d;
+  }
 };
 
 function leadZero(num) {
-	if (num.toString().length == 1) { return '0'+num }
-	return num;
-}
\ No newline at end of file
+  if (num.toString().length == 1) { return '0'+num }
+  return num;
+}
--- a/testing/extensions/community/chrome/content/notifications.js
+++ b/testing/extensions/community/chrome/content/notifications.js
@@ -31,244 +31,244 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 
 document.addEventListener('load', function() {
-	window.setInterval(qaNotifications.updateNotificationStore(), 3600000);
+  window.setInterval(qaNotifications.updateNotificationStore(), 3600000);
 }, false)
 
 var qaNotifications = {
-	storageService : Components.classes["@mozilla.org/storage/service;1"]
+  storageService : Components.classes["@mozilla.org/storage/service;1"]
                         .getService(Ci.mozIStorageService),
-	dbHandle : null,
-	
-	openDatabase : function() {
-		var file = Cc["@mozilla.org/file/directory_service;1"]
+  dbHandle : null,
+
+  openDatabase : function() {
+    var file = Cc["@mozilla.org/file/directory_service;1"]
                      .getService(Ci.nsIProperties)
                      .get("ProfD", Ci.nsIFile);
-		file.append("mozqa.sqlite");
-   		this.dbHandle = this.storageService.openDatabase(file);
-   		this.createNotificationTable();
-   	},
-   	
-   	closeDatabase : function() {
-   		// there's no way to actually close a database, but setting 
-   		// the db reference to null will cause the db handle to become 
-   		// elegible for GC which is about as good as it gets
-   		dbHandle = null;
-   	},
-   	
-   	createNotificationTable : function() {
-   		this.db.executeSimpleSQL("CREATE TABLE if not exists notifications ( \
-   		  id text, \
-   		  datetime integer, \
-   		  firstNotification integer, \
-   		  secondNotification integer, \
-   		  serializedJSData string)");
-   	},
-   	
-   	updateNotificationStore : function() {
-   		var req = new XMLHttpRequest();
-   		var url = qaPref.getPref('qa.extension.hermes.url', 'char');
-   		req.open('GET', url, true);
-   		req.onreadystatechange = function(evt) {
-   			if (req.readyState == 4 && req.status == 200) {
-   				if (req.responseXML.getElementsByTagName('notifications') == null)
-					return;
-				var notifs = req.responseXML.getElementsByTagName('notification');
-				for (var i=0; i<notifs.length; i++) {
-					var notif = notifs[i];
-					notif = new Notification('xml', notif);
-					notif.serializeToDb();
-				}    
-   			}
-   		};
-   		req.send(null);
-   	},
-   	
-   	checkNotificationStatus : function() { 	
-   		// see if we are elegible for notification:
-   		var time = qaPref.getPref(qaPref.prefBase+'.lastNotificationCheckTime', 'int');
-   		var interval = qaPref.getPref(qaPref.prefBase+'.minNotificationCheckInterval', 'int');
-   		if (time + interval > new Date().valueOf())
-   			return; // nothing to see here, try again later
-   		
-   		var sth = this.db.createStatement("SELECT * FROM notifications");
-   		var notifications = [];
-   		try {
-			while (sth.executeStep()) {
-				notifications.push(new Notification('json', MochiKit.Base.evalJSON(
-					sth.getString(4))));
-			}
-		} finally {
-   			sth.reset();
-   		}
+    file.append("mozqa.sqlite");
+      this.dbHandle = this.storageService.openDatabase(file);
+      this.createNotificationTable();
+    },
+
+    closeDatabase : function() {
+      // there's no way to actually close a database, but setting
+      // the db reference to null will cause the db handle to become
+      // elegible for GC which is about as good as it gets
+      dbHandle = null;
+    },
+
+    createNotificationTable : function() {
+      this.db.executeSimpleSQL("CREATE TABLE if not exists notifications ( \
+        id text, \
+        datetime integer, \
+        firstNotification integer, \
+        secondNotification integer, \
+        serializedJSData string)");
+    },
+
+    updateNotificationStore : function() {
+      var req = new XMLHttpRequest();
+      var url = qaPref.getPref('qa.extension.hermes.url', 'char');
+      req.open('GET', url, true);
+      req.onreadystatechange = function(evt) {
+        if (req.readyState == 4 && req.status == 200) {
+          if (req.responseXML.getElementsByTagName('notifications') == null)
+          return;
+        var notifs = req.responseXML.getElementsByTagName('notification');
+        for (var i=0; i<notifs.length; i++) {
+          var notif = notifs[i];
+          notif = new Notification('xml', notif);
+          notif.serializeToDb();
+        }
+        }
+      };
+      req.send(null);
+    },
 
-   		if (notifications[0] && notifications[0].okToShow() == true) {
-   			notifications[0].displayToBox();
-   			$('qa-notify').removeAttribute('hidden');
-   		}
-   		// reset the interval timer
-   		qaPref.setPref(qaPref.prefBase+'.lastNotificationCheckTime', new Date().valueOf(), 'int');
-   	},
-   	
-   	showHideNotify: function(bool) {
-		var notify = $('qa-notify');
-		if (bool == true) {
-			notify.removeAttribute("hidden");
-		} else {
-			notify.setAttribute("hidden", "true");
-		}
-	},
-	
-	getNotificationSettings : function(bool) {
-		var prefs = qaPref.getPref(qaPref.prefBase+'.notificationSettings', 'char');
-		return prefs.split(",");
-	},
+    checkNotificationStatus : function() {
+      // see if we are elegible for notification:
+      var time = qaPref.getPref(qaPref.prefBase+'.lastNotificationCheckTime', 'int');
+      var interval = qaPref.getPref(qaPref.prefBase+'.minNotificationCheckInterval', 'int');
+      if (time + interval > new Date().valueOf())
+        return; // nothing to see here, try again later
+
+      var sth = this.db.createStatement("SELECT * FROM notifications");
+      var notifications = [];
+      try {
+      while (sth.executeStep()) {
+        notifications.push(new Notification('json', MochiKit.Base.evalJSON(
+          sth.getString(4))));
+      }
+    } finally {
+        sth.reset();
+      }
+
+      if (notifications[0] && notifications[0].okToShow() == true) {
+        notifications[0].displayToBox();
+        $('qa-notify').removeAttribute('hidden');
+      }
+      // reset the interval timer
+      qaPref.setPref(qaPref.prefBase+'.lastNotificationCheckTime', new Date().valueOf(), 'int');
+    },
+
+    showHideNotify: function(bool) {
+    var notify = $('qa-notify');
+    if (bool == true) {
+      notify.removeAttribute("hidden");
+    } else {
+      notify.setAttribute("hidden", "true");
+    }
+  },
+
+  getNotificationSettings : function(bool) {
+    var prefs = qaPref.getPref(qaPref.prefBase+'.notificationSettings', 'char');
+    return prefs.split(",");
+  },
 };
 qaNotifications.__defineGetter__('db', function() {
-	if (this.dbHandle != null)
-		return this.dbHandle;
-	else {
-		this.openDatabase();
-		return this.dbHandle;
-	}
+  if (this.dbHandle != null)
+    return this.dbHandle;
+  else {
+    this.openDatabase();
+    return this.dbHandle;
+  }
 });
 
 function Notification() {
-	
+
 }
 
 function Notification(type, data) {
-	if (type == 'json') {
-		this.id = data.id;
-		this.notificationClass = data.notificationClass;
-		this.type = data.type;
-		this.headline = data.headline;
-		this.datetime = MochiKit.DateTime.isoTimestamp(data.datetime);
-		this.place = data.place;
-		this.infotext = data.infotext;
-		this.infolinktext = data.infolinktext;
-		this.infolinkhref = data.infolinkhref;
-		this.golinktext = data.golinktext;
-		this.golinkhref = data.golinkhref;
-	} else if (type == 'xml') {
-		var notif = data;
-		this.id = notif.getAttribute('id');
-		this.notificationClass = notif.getAttribute('class');
-		this.type = notif.getAttribute('type');
-		if (notif.getElementsByTagName('headline')[0] != null)
-			this.headline = notif.getElementsByTagName('headline')[0].textContent;
-		
-		// eventinfo
-		if (this.notificationClass == 'event') {
-			var eventInfo = notif.getElementsByTagName('eventinfo')[0];
-			this.datetime = MochiKit.DateTime.isoTimestamp(
-				eventInfo.getElementsByTagName('datetime')[0].textContent);
-			this.place = eventInfo.getElementsByTagName('place')[0].textContent;
-		}
-		this.infotext = notif.getElementsByTagName('infotext')[0].textContent;
-		this.infolinktext = notif.getElementsByTagName('infolink')[0].textContent;
-		this.infolinkhref = notif.getElementsByTagName('infolink')[0]
-			.getAttribute('href');
-		this.golinktext = notif.getElementsByTagName('golink')[0].textContent;
-		this.golinkhref = notif.getElementsByTagName('golink')[0]
-			.getAttribute('href');
-	}
+  if (type == 'json') {
+    this.id = data.id;
+    this.notificationClass = data.notificationClass;
+    this.type = data.type;
+    this.headline = data.headline;
+    this.datetime = MochiKit.DateTime.isoTimestamp(data.datetime);
+    this.place = data.place;
+    this.infotext = data.infotext;
+    this.infolinktext = data.infolinktext;
+    this.infolinkhref = data.infolinkhref;
+    this.golinktext = data.golinktext;
+    this.golinkhref = data.golinkhref;
+  } else if (type == 'xml') {
+    var notif = data;
+    this.id = notif.getAttribute('id');
+    this.notificationClass = notif.getAttribute('class');
+    this.type = notif.getAttribute('type');
+    if (notif.getElementsByTagName('headline')[0] != null)
+      this.headline = notif.getElementsByTagName('headline')[0].textContent;
+
+    // eventinfo
+    if (this.notificationClass == 'event') {
+      var eventInfo = notif.getElementsByTagName('eventinfo')[0];
+      this.datetime = MochiKit.DateTime.isoTimestamp(
+        eventInfo.getElementsByTagName('datetime')[0].textContent);
+      this.place = eventInfo.getElementsByTagName('place')[0].textContent;
+    }
+    this.infotext = notif.getElementsByTagName('infotext')[0].textContent;
+    this.infolinktext = notif.getElementsByTagName('infolink')[0].textContent;
+    this.infolinkhref = notif.getElementsByTagName('infolink')[0]
+      .getAttribute('href');
+    this.golinktext = notif.getElementsByTagName('golink')[0].textContent;
+    this.golinkhref = notif.getElementsByTagName('golink')[0]
+      .getAttribute('href');
+  }
 }
 
 Notification.prototype = {
-	id : null,
-	notificationClass : null,
-	type : null,
-	headline : null,
-	datetime : null,
-	place : null,
-	infotext : null,
-	infolinktext : null,
-	infolinkhref : null,
-	golinktext : null,
-	golinkhref : null,
-	
-	hasHadFirstNotification : false,
-	hasHadSecondNotification : false,
-	serializedJSData : null,
-	
-	serializeToDb: function() {
-		var query = qaNotifications.db.createStatement("SELECT id FROM notifications \
-			WHERE id = ?1");
-		query.bindStringParameter(0, this.id);
-		var foundRow;
-		while (query.executeStep()) {
-			foundRow = 1;
-		}
-		query.reset();
-		if (foundRow == 1) { // it's already been inserted, so update
-			return;
-		}
-		
-		var sth = qaNotifications.db.createStatement("INSERT into notifications \
-			values (?1, ?2, ?3, ?4, ?5)");
-		sth.bindStringParameter(0, this.id);
-		sth.bindStringParameter(1, this.datetime);
-		sth.bindStringParameter(2, this.hasHadFirstNotification);
-		sth.bindStringParameter(3, this.hasHadSecondNotification);
-		
-		// avoid having serialized data inside serialized data:
-		this.serializedJSData = null; 
-		var jsData = MochiKit.Base.serializeJSON(this);
-		sth.bindStringParameter(4, jsData);
-	
-		sth.execute();
-	},
-	displayToBox : function() {
-		$('qa-notify-header').value=this.headline;
-		
-		if ($('qa-notify-text').firstChild)
-			$('qa-notify-text').removeChild($('qa-notify-text').firstChild);
-		$('qa-notify-text').appendChild(document.createTextNode(this.infotext));
-		
-		$('qa-notify-infolink').value=this.infolinktext;
-		$('qa-notify-infolink').href=this.infolinkhref;
-		$('qa-notify-infolink').style.display = '';
-		
-		if (this.notificationClass == 'event') {
-			var inprogress = 0;
-			$('qa-notify-event-datetime').value=this.datetime;
-			$('qa-notify-event-place').value=this.place;	
-			$('qa-notify-event').style.display = '';
-			$('qa-notify-inprogress').style.display = 'none';
-			
-			$('qa-notify-getstartedlink').value=this.golinktext;
-			$('qa-notify-getstartedlink').href=this.golinkhref;
-			
-			if (inprogress == 1) {
-				$('qa-notify-inprogress').style.display = '';
-				$('qa-notify-getstartedlink').style.display = '';
-				$('qa-notify-infolink').style.display = 'none';
-			}
-		}
-	},
-	okToShow : function() {
-		var prefs = qaNotifications.getNotificationSettings();
-		if (prefs[0] == '1') // all notifications disabled
-			return false;
-		if (this.type == 'testday' && ! prefs[1] == '0')
-			return true;
-		if (this.type == 'bugday' && ! prefs[2] == '0')
-			return true;
-		if (this.type == 'prerelease' && ! prefs[3] == '0')
-			return true;
-		if (this.type == 'news' && ! prefs[4] == '0')
-			return true;
-		if (this.type == 'newbuilds' && ! prefs[5] == '0')
-			return true;
-		if (this.type == 'special' && ! prefs[6] == '0')
-			return true;
-		
-		// catch all:
-		return false;
-	},
-};
\ No newline at end of file
+  id : null,
+  notificationClass : null,
+  type : null,
+  headline : null,
+  datetime : null,
+  place : null,
+  infotext : null,
+  infolinktext : null,
+  infolinkhref : null,
+  golinktext : null,
+  golinkhref : null,
+
+  hasHadFirstNotification : false,
+  hasHadSecondNotification : false,
+  serializedJSData : null,
+
+  serializeToDb: function() {
+    var query = qaNotifications.db.createStatement("SELECT id FROM notifications \
+      WHERE id = ?1");
+    query.bindStringParameter(0, this.id);
+    var foundRow;
+    while (query.executeStep()) {
+      foundRow = 1;
+    }
+    query.reset();
+    if (foundRow == 1) { // it's already been inserted, so update
+      return;
+    }
+
+    var sth = qaNotifications.db.createStatement("INSERT into notifications \
+      values (?1, ?2, ?3, ?4, ?5)");
+    sth.bindStringParameter(0, this.id);
+    sth.bindStringParameter(1, this.datetime);
+    sth.bindStringParameter(2, this.hasHadFirstNotification);
+    sth.bindStringParameter(3, this.hasHadSecondNotification);
+
+    // avoid having serialized data inside serialized data:
+    this.serializedJSData = null;
+    var jsData = MochiKit.Base.serializeJSON(this);
+    sth.bindStringParameter(4, jsData);
+
+    sth.execute();
+  },
+  displayToBox : function() {
+    $('qa-notify-header').value=this.headline;
+
+    if ($('qa-notify-text').firstChild)
+      $('qa-notify-text').removeChild($('qa-notify-text').firstChild);
+    $('qa-notify-text').appendChild(document.createTextNode(this.infotext));
+
+    $('qa-notify-infolink').value=this.infolinktext;
+    $('qa-notify-infolink').href=this.infolinkhref;
+    $('qa-notify-infolink').style.display = '';
+
+    if (this.notificationClass == 'event') {
+      var inprogress = 0;
+      $('qa-notify-event-datetime').value=this.datetime;
+      $('qa-notify-event-place').value=this.place;
+      $('qa-notify-event').style.display = '';
+      $('qa-notify-inprogress').style.display = 'none';
+
+      $('qa-notify-getstartedlink').value=this.golinktext;
+      $('qa-notify-getstartedlink').href=this.golinkhref;
+
+      if (inprogress == 1) {
+        $('qa-notify-inprogress').style.display = '';
+        $('qa-notify-getstartedlink').style.display = '';
+        $('qa-notify-infolink').style.display = 'none';
+      }
+    }
+  },
+  okToShow : function() {
+    var prefs = qaNotifications.getNotificationSettings();
+    if (prefs[0] == '1') // all notifications disabled
+      return false;
+    if (this.type == 'testday' && ! prefs[1] == '0')
+      return true;
+    if (this.type == 'bugday' && ! prefs[2] == '0')
+      return true;
+    if (this.type == 'prerelease' && ! prefs[3] == '0')
+      return true;
+    if (this.type == 'news' && ! prefs[4] == '0')
+      return true;
+    if (this.type == 'newbuilds' && ! prefs[5] == '0')
+      return true;
+    if (this.type == 'special' && ! prefs[6] == '0')
+      return true;
+
+    // catch all:
+    return false;
+  }
+};
--- a/testing/extensions/community/chrome/content/prefs.js
+++ b/testing/extensions/community/chrome/content/prefs.js
@@ -35,158 +35,158 @@
 * ***** END LICENSE BLOCK ***** */
 
 
 var qaPref = {
    litmus : null,
    prefBase : "qa.extension",
 
    setPref : function(aName, aValue, aType) {
-     
+
      var pref = Components.classes["@mozilla.org/preferences-service;1"]
-        			.getService(Components.interfaces.nsIPrefBranch);     
+              .getService(Components.interfaces.nsIPrefBranch);
      try{
        if(aType == "bool")
          pref.setBoolPref(aName, aValue);
-       else if(aType == "int")   
+       else if(aType == "int")
          pref.setIntPref(aName, aValue);
        else if(aType == "char")
          pref.setCharPref(aName, aValue);
      }
      catch(e){ };
    },
-   
+
    getPref : function(aName, aType) {
-     
+
      var pref = Components.classes["@mozilla.org/preferences-service;1"]
-        			.getService(Components.interfaces.nsIPrefBranch);
+              .getService(Components.interfaces.nsIPrefBranch);
      try{
        var result;
        if(aType == "bool")
          result = pref.getBoolPref(aName);
-       else if(aType == "int")   
+       else if(aType == "int")
          result = pref.getIntPref(aName);
-       else if(aType == "char")      
+       else if(aType == "char")
          result = pref.getCharPref(aName);
 
      return result;
      }
      catch(e){
        if(aType == "bool"){
          return false;
-       }          
+       }
        else if(aType == "int"){
          return 0;
        }
        else if(aType == "char"){
-         return null; 
+         return null;
        }
      }
    return null;
-   },
+   }
 };
 
 // public API:
-//	qaPref.litmus.getUsername()
-//	qaPref.litmus.getPassword()
-//	qaPref.litmus.setPassword()
+// qaPref.litmus.getUsername()
+// qaPref.litmus.getPassword()
+// qaPref.litmus.setPassword()
 // everything else is abstracted away to deal with fx2 vs fx3 changes
 
 var CC_passwordManager = Components.classes["@mozilla.org/passwordmanager;1"];
 var CC_loginManager = Components.classes["@mozilla.org/login-manager;1"];
 
-if (CC_passwordManager != null) { // old-fashioned password manager
-	qaPref.litmus = {
-	   passwordName : function() {return "mozqa-extension-litmus-"+litmus.baseURL},
-	
-	   manager : function() {
-		   return Components.classes["@mozilla.org/passwordmanager;1"].
-				   getService(Components.interfaces.nsIPasswordManager);
-	   },
-	   getPasswordObj : function() {
-		   var m = this.manager();
-		   var e = m.enumerator;
-		   
-		   // iterate through the PasswordManager service to find 
-		   // our password:
-		   var password;
-		   while(e.hasMoreElements()) {
-			   try {
-				   var pass = e.getNext().
-					   QueryInterface(Components.interfaces.nsIPassword);
-				   if (pass.host == this.passwordName()) {
-					   password=pass; // found it
-					   return password;
-				   }
-			   } catch (ex) { return false; }
-		   }
-		   if (!password) { return false; }
-		   return password;
-	   },
-	   getUsername : function() {
-		   var password = this.getPasswordObj();
-		   try {
-			   return password.user;
-		   } catch (ex) { return false; }
-	   },
-	   getPassword : function() {
-		   var password=this.getPasswordObj();
-		   try {
-			   return password.password;
-		   } catch (ex) { return false; }
-	   },
-	   setPassword : function(username, password) {
-		   var m = this.manager();
-		   // check to see whether we already have a password stored 
-		   // for the current baseURL. If we do, remove it before adding 
-		   // any new passwords:
-		   var p;
-		   while (p = this.getPasswordObj()) {
-			   m.removeUser(p.host, p.user);
-		   }
-		   m.addUser(this.passwordName(), username, password);
-	   },
-	};	
-} else if (CC_loginManager != null) { // use the new login manager interface
-	qaPref.litmus = {
-		manager : function() {
-			return Components.classes["@mozilla.org/login-manager;1"]
-						   .getService(Components.interfaces.nsILoginManager);
-		},
-		getUsername : function() {
-		   var password = this.getPasswordObj();
-		   try {
-			   return password.username;
-		   } catch (ex) { return false; }
-		},
-		getPassword : function() {
-		   var password=this.getPasswordObj();
-		   try {
-			   return password.password;
-		   } catch (ex) { return false; }
-		},
-		setPassword : function(username, password) {
-			// if we already have a password stored, remove it first:
-			var login = this.getPasswordObj();
-			if (login != false) {
-				this.manager().removeLogin(login);
-			}
-			
-			var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
+  if (CC_passwordManager != null) { // old-fashioned password manager
+  qaPref.litmus = {
+     passwordName : function() {return "mozqa-extension-litmus-"+litmus.baseURL},
+
+     manager : function() {
+       return Components.classes["@mozilla.org/passwordmanager;1"].
+           getService(Components.interfaces.nsIPasswordManager);
+     },
+     getPasswordObj : function() {
+       var m = this.manager();
+       var e = m.enumerator;
+
+       // iterate through the PasswordManager service to find
+       // our password:
+       var password;
+       while(e.hasMoreElements()) {
+         try {
+           var pass = e.getNext().
+             QueryInterface(Components.interfaces.nsIPassword);
+           if (pass.host == this.passwordName()) {
+             password=pass; // found it
+             return password;
+           }
+         } catch (ex) { return false; }
+       }
+       if (!password) { return false; }
+       return password;
+     },
+     getUsername : function() {
+       var password = this.getPasswordObj();
+       try {
+         return password.user;
+       } catch (ex) { return false; }
+     },
+     getPassword : function() {
+       var password=this.getPasswordObj();
+       try {
+         return password.password;
+       } catch (ex) { return false; }
+     },
+     setPassword : function(username, password) {
+       var m = this.manager();
+       // check to see whether we already have a password stored
+       // for the current baseURL. If we do, remove it before adding
+       // any new passwords:
+       var p;
+       while (p = this.getPasswordObj()) {
+         m.removeUser(p.host, p.user);
+       }
+       m.addUser(this.passwordName(), username, password);
+     }
+  };
+  } else if (CC_loginManager != null) { // use the new login manager interface
+  qaPref.litmus = {
+    manager : function() {
+      return Components.classes["@mozilla.org/login-manager;1"]
+               .getService(Components.interfaces.nsILoginManager);
+    },
+    getUsername : function() {
+       var password = this.getPasswordObj();
+       try {
+         return password.username;
+       } catch (ex) { return false; }
+    },
+    getPassword : function() {
+       var password=this.getPasswordObj();
+       try {
+         return password.password;
+       } catch (ex) { return false; }
+    },
+    setPassword : function(username, password) {
+      // if we already have a password stored, remove it first:
+      var login = this.getPasswordObj();
+      if (login != false) {
+        this.manager().removeLogin(login);
+      }
+
+      var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
                                         Components.interfaces.nsILoginInfo,
                                         "init");
-            var newLogin = new nsLoginInfo('chrome://qa', 'Litmus Login', litmus.baseURL, 
-            	username, password, null, null);
-            this.manager().addLogin(newLogin);        
-		},
-		getPasswordObj: function() {
-			try {
-				var logins = this.manager().findLogins({}, 'chrome://qa', 
-					'Litmus Login', litmus.baseURL);
-				if (logins.length > 0 && logins[0] != null) 
-					return logins[0];
-				return false;
-			} catch(ex) {
-				return false;
-			}
-		},
-	};
-}
\ No newline at end of file
+            var newLogin = new nsLoginInfo('chrome://qa', 'Litmus Login', litmus.baseURL,
+              username, password, null, null);
+            this.manager().addLogin(newLogin);
+    },
+    getPasswordObj: function() {
+      try {
+        var logins = this.manager().findLogins({}, 'chrome://qa',
+          'Litmus Login', litmus.baseURL);
+        if (logins.length > 0 && logins[0] != null)
+          return logins[0];
+        return false;
+      } catch(ex) {
+        return false;
+      }
+    }
+  };
+}
--- a/testing/extensions/community/chrome/content/qa.js
+++ b/testing/extensions/community/chrome/content/qa.js
@@ -31,40 +31,61 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 
 var qaMain = {
-	htmlNS: "http://www.w3.org/1999/xhtml",
-			
-	openQATool : function() {
-		window.open("chrome://qa/content/qa.xul", "_blank", "chrome,all,dialog=no,resizable=no");
-	},
-	onToolOpen : function() {
-		if (qaPref.getPref(qaPref.prefBase+'.isFirstTime', 'bool') == true) {
-			window.open("chrome://qa/content/setup.xul", "_blank", "chrome,all,dialog=yes");
+  htmlNS: "http://www.w3.org/1999/xhtml",
+
+  openQATool : function() {
+    window.open("chrome://qa/content/qa.xul", "_blank",
+                "chrome,all,dialog=no,resizable=no");
+  },
+  onToolOpen : function() {
+    if (qaPref.getPref(qaPref.prefBase+'.isFirstTime', 'bool') == true) {
+      window.open("chrome://qa/content/setup.xul", "_blank",
+                  "chrome,all,dialog=yes");
         }
-		if (qaPref.getPref(qaPref.prefBase + '.currentTestcase.testrunSummary', 'char') != null) {
+    if (qaPref.getPref(qaPref.prefBase + '.currentTestcase.testrunSummary', 'char') != null) {
             litmus.readStateFromPref();
         }
-	},
+  },
+    onSwitchTab : function() {
+    var newSelection = $('qa_tabrow').selectedItem;
+
+    // user is switching to the prefs tab:
+    if ($('qa_tabrow').selectedItem == $('qa-tabbar-prefs')) {
+            qaPrefsWindow.loadPrefsWindow();
+    } else if ($('qa_tabrow').selectedItem == $('qa-tabbar-bugzilla')) {
+            bugzilla.unhighlightTab();
+        }
+
+    // user is switching away from the prefs tab:
+    if (qaPrefsWindow.lastSelectedTab != null &&
+        qaPrefsWindow.lastSelectedTab == $('qa-tabbar-prefs')) {
+      qaPrefsWindow.savePrefsWindow();
+    }
+
+    qaPrefsWindow.lastSelectedTab = newSelection;
+  }
 };
+
 qaMain.__defineGetter__("bundle", function(){return $("bundle_qa");});
 qaMain.__defineGetter__("urlbundle", function(){return $("bundle_urls");});
 function $() {
   var elements = new Array();
 
-  for (var i = 0; i < arguments.length; i++) {
-	var element = arguments[i];
-	if (typeof element == 'string')
-	  element = document.getElementById(element);
+for (var i = 0; i < arguments.length; i++) {
+  var element = arguments[i];
+  if (typeof element == 'string')
+    element = document.getElementById(element);
 
-	if (arguments.length == 1)
-	  return element;
+  if (arguments.length == 1)
+    return element;
 
-	elements.push(element);
+  elements.push(element);
   }
 
   return elements;
 }
--- a/testing/extensions/community/chrome/content/qa.xul
+++ b/testing/extensions/community/chrome/content/qa.xul
@@ -1,44 +1,45 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+- ***** BEGIN LICENSE BLOCK *****
+- Version: MPL 1.1/GPL 2.0/LGPL 2.1
+-
+- The contents of this file are subject to the Mozilla Public License Version
+- 1.1 (the "License"); you may not use this file except in compliance with
+- the License. You may obtain a copy of the License at
+- http://www.mozilla.org/MPL/
+-
+- Software distributed under the License is distributed on an "AS IS" basis,
+- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+- for the specific language governing rights and limitations under the
+- License.
+-
+- The Original Code is the Mozilla Community QA Extension
+-
+- The Initial Developer of the Original Code is the Mozilla Corporation.
+- Portions created by the Initial Developer are Copyright (C) 2007
+- the Initial Developer. All Rights Reserved.
+-
+- Contributor(s):
+-   Zach Lipton <zach@zachlipton.com>
+-   Ben Hsieh <ben.hsieh@gmail.com>
+-
+- Alternatively, the contents of this file may be used under the terms of
+- either the GNU General Public License Version 2 or later (the "GPL"), or
+- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+- in which case the provisions of the GPL or the LGPL are applicable instead
+- of those above. If you wish to allow use of your version of this file only
+- under the terms of either the GPL or the LGPL, and not to allow others to
+- use your version of this file under the terms of the MPL, indicate your
+- decision by deleting the provisions above and replace them with the notice
+- and other provisions required by the LGPL or the GPL. If you do not delete
+- the provisions above, a recipient may use your version of this file under
+- the terms of any one of the MPL, the GPL or the LGPL.
+-
+- ***** END LICENSE BLOCK ***** -->
 
 <?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
 <?xml-stylesheet href="chrome://global/skin/browser.css" type="text/css"?>
 <?xml-stylesheet href="chrome://qa/skin/qa.css" type="text/css"?>
 <?xml-stylesheet href="chrome://qa/skin/platform.css" type="text/css"?>
 
 <!DOCTYPE window [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
@@ -68,34 +69,43 @@
 <script type="application/x-javascript" src="chrome://browser/content/utilityOverlay.js" />
 <script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
 <script type="application/x-javascript" src="chrome://qa/content/litmusReporter.js" />
 <script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
 <script type="application/x-javascript" src="chrome://qa/content/common.js" />
 <script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
 <script type="application/x-javascript" src="chrome://qa/content/qa.js" />
 <script type="application/x-javascript" src="chrome://qa/content/tabs/qmo.js" />
+<script type="application/x-javascript" src="chrome://qa/content/tabs/bugzilla.js" />
+<script type="application/x-javascript" src="chrome://qa/content/tabs/bugAccess.js" />
+
+<script type="application/x-javascript">
+
+    // on load, set an event listener to deal with saving settings when
+    // changing tabs
+    window.addEventListener('load', function() {
+        $('qa_tabrow').addEventListener('select', qaMain.onSwitchTab, false);
+    }, false);
+</script>
 
 <tabbox id="qa_tabbox">
   <tabs id="qa_tabrow">
     <tab id="qa-tabbar-qmo" class="tabbrowser-tab" />
     <tab label="&qa.litmus.title;" class="tabbrowser-tab" />
-    <tab label="&qa.bugzilla.title;" class="tabbrowser-tab" />
+    <tab label="&qa.bugzilla.title;" id="qa-tabbar-bugzilla" class="tabbrowser-tab" />
     <tab label="&qa.chat.title;" class="tabbrowser-tab" />
     <spacer id="qa-tabbar-spacer" />
     <tab label="&qa.preferences.title;" id="qa-tabbar-prefs" class="tabbrowser-tab" />
     <tab label="&qa.help.title;" class="tabbrowser-tab" />
   </tabs>
   <tabpanels id="qa_tabpanels">
     <tabpanel id="qa-tab-qmo"></tabpanel>
     <tabpanel id="qa-tab-litmus"></tabpanel>
     <tabpanel id="qa-tab-bugzilla"></tabpanel>
     <tabpanel id="qa-tab-chat"></tabpanel>
-    
+
     <tabpanel id="qa-tab-SPACER"></tabpanel>
-    
+
     <tabpanel id="qa-tab-settings"></tabpanel>
     <tabpanel id="qa-tab-help"></tabpanel>
   </tabpanels>
 </tabbox>
-  
-  
-</window>
\ No newline at end of file
+</window>
--- a/testing/extensions/community/chrome/content/settings.js
+++ b/testing/extensions/community/chrome/content/settings.js
@@ -14,16 +14,17 @@
  * The Original Code is the Mozilla Community QA Extension
  *
  * The Initial Developer of the Original Code is the Mozilla Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2006
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *  Zach Lipton <zach@zachlipton.com>
+ *  Ben Hsieh <ben.hsieh@gmail.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -31,252 +32,239 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 
 var qaPrefsWindow = {
-	lastSelectedTab : null,
-	
-	onSwitchTab : function() {
-		var newSelection = $('qa_tabrow').selectedItem;
-		
-		// user is switching to the prefs tab:
-		if ($('qa_tabrow').selectedItem == $('qa-tabbar-prefs')) {
-            qaPrefsWindow.loadPrefsWindow();
-		}
-		
-		// user is switching away from the prefs tab:
-		if (qaPrefsWindow.lastSelectedTab != null && 
-				qaPrefsWindow.lastSelectedTab == $('qa-tabbar-prefs')) {
-			qaPrefsWindow.savePrefsWindow();
-		}
-		
-		qaPrefsWindow.lastSelectedTab = newSelection;
-	},
+  lastSelectedTab : null,
+
+  loadPrefsWindow : function() {
+    prefsTabOpen = true;
+    document.getElementById('qa-preferences-litmus-username').value =
+      qaPref.litmus.getUsername() || '';
+    document.getElementById('qa-preferences-litmus-password').value =
+      qaPref.litmus.getPassword() || '';
 
-	loadPrefsWindow : function() {
-		prefsTabOpen = true;
-		document.getElementById('qa-preferences-litmus-username').value = 
-			qaPref.litmus.getUsername() || '';
-		document.getElementById('qa-preferences-litmus-password').value = 
-			qaPref.litmus.getPassword() || '';
-			
-		// load notification settings:
-		var prefs = qaPref.getPref(qaPref.prefBase+'.notificationSettings', 'char');
-		prefs = prefs.split(",");
-		var notify = $('qa-prefs-notify').childNodes;
-		var prefCounter = 0;
-		for (var i=0; i<notify.length; i++) {
-			if (notify[i].setChecked != null && notify[i].checked != null) { // it's a checkbox
-				if (prefs[prefCounter] == "1") 
-					notify[i].checked = true;
-				else
-					notify[i].checked = false;
-				prefCounter++;
-			}
-		}
-	},
-	savePrefsWindow : function() {
-		// save notification settings
-		var notify = $('qa-prefs-notify').childNodes;
-		var prefs = '';
-		for (var i=0; i<notify.length; i++) {
-			if (notify[i].setChecked != null && (notify[i].checked == true 
-				  || notify[i].checked == false)) { // it's a checkbox
-				if (notify[i].checked == false)
-					prefs += '0,';
-				else 
-					prefs += '1,';
-			}
-		}
-		prefs = prefs.substring(0, prefs.length-1); // remove the trailing comma
-		qaPref.setPref(qaPref.prefBase+'.notificationSettings', prefs, 'char');
-		
-		// save litmus account settings
-		var uname = document.getElementById('qa-preferences-litmus-username').value;
-		var passwd = document.getElementById('qa-preferences-litmus-password').value;
-		
-		// if uname and passwd are unchanged, we're done:
-		if (uname == qaPref.litmus.getUsername() && 
-				passwd == qaPref.litmus.getPassword()) 
-			return;
-		var callback = function(resp) {
-			if (resp.responseText == 0) {
-				alert(document.getElementById("bundle_qa").
-					getString("qa.extension.prefs.loginError"));
-				// snap the tab selection back to prefs:
-				$('qa_tabrow').selectedItem = $('qa-tabbar-prefs');
-				return false;
-			} else {
-				qaPref.litmus.setPassword(uname, passwd);
-				return true;
-			}
-		}
-		litmus.validateLogin(uname, passwd, callback);
-		return false; // not ready to close yet
-	},
-	loadUsernameAndPassword : function() {
-		var uname = document.getElementById('qa-preferences-litmus-username');
-		var passwd = document.getElementById('qa-preferences-litmus-password');
-		
-		uname.value = qaPref.litmus.getUsername();
-		passwd.value = qaPref.litmus.getPassword();
-	},
-	createAccount : function() {
-		window.openDialog("chrome://qa/content/accountcreate.xul", "_blank", "chrome,all,dialog=yes", qaPrefsWindow.loadUsernameAndPassword);
-	},
+    // load notification settings:
+    var prefs = qaPref.getPref(qaPref.prefBase+'.notificationSettings', 'char');
+    prefs = prefs.split(",");
+    var notify = $('qa-prefs-notify').childNodes;
+    var prefCounter = 0;
+    for (var i=0; i<notify.length; i++) {
+      if (notify[i].setChecked != null && notify[i].checked != null) { // it's a checkbox
+        if (prefs[prefCounter] == "1")
+          notify[i].checked = true;
+        else
+          notify[i].checked = false;
+        prefCounter++;
+      }
+    }
+  },
+  savePrefsWindow : function() {
+    // save notification settings
+    var notify = $('qa-prefs-notify').childNodes;
+    var prefs = '';
+    for (var i=0; i<notify.length; i++) {
+      if (notify[i].setChecked != null && (notify[i].checked == true
+          || notify[i].checked == false)) { // it's a checkbox
+        if (notify[i].checked == false)
+          prefs += '0,';
+        else
+          prefs += '1,';
+      }
+    }
+    prefs = prefs.substring(0, prefs.length-1); // remove the trailing comma
+    qaPref.setPref(qaPref.prefBase+'.notificationSettings', prefs, 'char');
+
+    // save litmus account settings
+    var uname = document.getElementById('qa-preferences-litmus-username').value;
+    var passwd = document.getElementById('qa-preferences-litmus-password').value;
+
+    // if uname and passwd are unchanged, we're done:
+    if (uname == qaPref.litmus.getUsername() &&
+        passwd == qaPref.litmus.getPassword())
+      return;
+    var callback = function(resp) {
+      if (resp.responseText == 0) {
+        alert(document.getElementById("bundle_qa").
+          getString("qa.extension.prefs.loginError"));
+        // snap the tab selection back to prefs:
+        $('qa_tabrow').selectedItem = $('qa-tabbar-prefs');
+        return false;
+      } else {
+        qaPref.litmus.setPassword(uname, passwd);
+        return true;
+      }
+    }
+    litmus.validateLogin(uname, passwd, callback);
+    return false; // not ready to close yet
+  },
+  loadUsernameAndPassword : function() {
+    var uname = document.getElementById('qa-preferences-litmus-username');
+    var passwd = document.getElementById('qa-preferences-litmus-password');
+
+    uname.value = qaPref.litmus.getUsername();
+    passwd.value = qaPref.litmus.getPassword();
+  },
+  createAccount : function() {
+    window.openDialog("chrome://qa/content/accountcreate.xul",
+                      "_blank",
+                      "chrome,all,dialog=yes",
+                      qaPrefsWindow.loadUsernameAndPassword);
+  }
 };
 
-
 var qaSetup = {
-	didSubmitForm : 0,
-	
-	hideAccountSettings : function() {
-		var accountyes = document.getElementById('qa-setup-accountyes');
-		var accountno = document.getElementById('qa-setup-accountno');
-		accountyes.style.display = 'none';
-		accountno.style.display = 'none';
-	},
-	loadAccountSettings : function() {
-		var uname = document.getElementById('username');
-		var passwd = document.getElementById('password');
-		uname.value = qaPref.litmus.getUsername() || '';
-		passwd.value = qaPref.litmus.getPassword() || '';
-		if (qaPref.litmus.getUsername()) { 
-			document.getElementById("qa-setup-account-haveaccount").selectedIndex=1;
-			document.getElementById('qa-setup-accountyes').style.display = '';
-		}
-		document.getElementById('qa-setup-createaccount-iframe').src = 
-			litmus.baseURL+'extension.cgi?createAccount=1';
-	},
-	
-	accountSetting : function(yesno) {
-		var accountyes = document.getElementById('qa-setup-accountyes');
-		var accountno = document.getElementById('qa-setup-accountno');
-		qaSetup.hideAccountSettings();
-		if (yesno == '0') {
-			accountno.style.display = '';
-		} else {
-			accountyes.style.display = '';
-		}
-	},
-	validateAccount : function() {
-		if (document.getElementById('qa-setup-accountno').style.display == '') {
-			// we're creating a new account, so get the uname and passwd 
-			// from the account created page:
-			var page = document.getElementById('qa-setup-createaccount-iframe').
-						contentDocument;
-			if (!page) {
-				alert("create account page is missing");
-				return false;
-			}
-			if (page.wrappedJSObject == null)
-				page.wrappedJSObject = page;
-			if (page.forms[0] && page.forms[0].wrappedJSObject == null)
-				page.forms[0].wrappedJSObject = page.forms[0];
-			
-			if (page.location == litmus.baseURL+'extension.cgi?createAccount=1'
-			    && qaSetup.didSubmitForm==0) {
-			    document.getElementById('qa-setup-accountconfirmloading').value = 
-document.getElementById("bundle_qa").getString("qa.extension.prefs.loadingMsg");
-				page.forms[0].wrappedJSObject.submit();
-				qaSetup.didSubmitForm = 1;
-				setTimeout("qaSetup.validateAccount()", 5000);
-				return false;
-			}
-			if (qaSetup.didSubmitForm == 1 && ! page.forms || 
-			   ! page.forms[0].wrappedJSObject || 
-			   ! page.forms[0].wrappedJSObject.email && 
-			   ! page.forms[0].wrappedJSObject.email.value)  
-			   		{qaSetup.didSubmitForm = 2;
-			   		setTimeout("qaSetup.validateAccount()", 4000);
-			   		return false;}
-			var e = '';
-			var p = '';
-			if (page.forms && page.forms[0].wrappedJSObject && 
-			    page.forms[0].wrappedJSObject.email && 
-				page.forms[0].wrappedJSObject.email.value) 
-				{ e=page.forms[0].wrappedJSObject.email.value }
-			if (page.forms && page.forms[0].wrappedJSObject && 
-			    page.forms[0].wrappedJSObject.password && 
-				page.forms[0].wrappedJSObject.password.value) 
-				{ p=page.forms[0].wrappedJSObject.password.value }
-			document.getElementById('username').value = e;
-			document.getElementById('password').value = p;
-		}
-		
-		document.getElementById('qa-setup-accountconfirmloading').value = 
-document.getElementById("bundle_qa").getString("qa.extension.prefs.loadingMsg");
-		
-		var uname = document.getElementById('username').value;
-		var passwd = document.getElementById('password').value;
-		
-		var callback = function(resp) {
-			if (resp.responseText != 1) { // failure
-				alert(document.getElementById("bundle_qa").
-					getString("qa.extension.prefs.loginError"));
-					document.getElementById('qa-setup-accountconfirmloading').value = null;
-				return false;
-			} else { // all's well
-				qaPref.litmus.setPassword(uname, passwd);
-				document.getElementById('qa-setup-accountconfirmloading').value = null;
-				document.getElementById('qa-setup').pageIndex++; // advance
-				return true;
-			}
-		}
-		litmus.validateLogin(uname, passwd, callback);
-		return false; // not ready to advance yet
-	},
-	
-	loadSysconfig : function() {
-		$('qa-setup-sysconfig-loading').value = 
-			$("bundle_qa").getString("qa.extension.sysconfig.loadingMsg");
-			
-		var guessInfo = function() {
-			var sysconfig;
-			try {
-				sysconfig = new Sysconfig();
-			} catch (ex) {}
-			var platItems = $('qa-setup-platform').menupopup.childNodes;
-			for (var i=0; i<platItems.length; i++) {
-				if (sysconfig.platform && platItems[i].label == sysconfig.platform)
-					$('qa-setup-platform').selectedIndex = i;
-			}
-			var opsysItems = $('qa-setup-opsys').menupopup.childNodes;
-			for (var i=0; i<opsysItems.length; i++) {
-				if (sysconfig.opsys && opsysItems[i].label == sysconfig.opsys)
-					$('qa-setup-opsys').selectedIndex = i;
-			}
-			$('qa-setup-sysconfig-loading').value = '';
-		};
-			
-		qaTools.loadJsonMenu(litmus.baseURL+"/json.cgi?platforms=1", 
-				$('qa-setup-platform'), 'name', 'name');
-	    qaTools.loadJsonMenu(litmus.baseURL+"/json.cgi?opsyses=1", 
-				$('qa-setup-opsys'), 'name', 'name', guessInfo);
-	},
-	
-	validateSysconfig : function() {
-		var sysconfig;
-		try {
-			sysconfig = new Sysconfig();
-		} catch (ex) {}
-		
-		// only set prefs for things which differ from the automatically 
-		// detected sysconfig for forward-compatibility
-		if (! sysconfig.platform == $('qa-setup-platform').selectedItem.label) {
-			qaPref.setPref(qaPref.prefBase+'.sysconfig.platform', 
-						$('qa-setup-platform').selectedItem.label, 'char');
-		}
-		if (! sysconfig.opsys == $('qa-setup-opsys').selectedItem.label) {
-			qaPref.setPref(qaPref.prefBase+'.sysconfig.opsys', 
-						$('qa-setup-opsys').selectedItem.label, 'char');
-		}
-		return true;
-	},
-	
-	finish : function() {
-		qaPref.setPref(qaPref.prefBase+'.isFirstTime', false, 'bool');
-	},
+  didSubmitForm : 0,
+
+  hideAccountSettings : function() {
+    var accountyes = document.getElementById('qa-setup-accountyes');
+    var accountno = document.getElementById('qa-setup-accountno');
+    accountyes.style.display = 'none';
+    accountno.style.display = 'none';
+  },
+  loadAccountSettings : function() {
+    var uname = document.getElementById('username');
+    var passwd = document.getElementById('password');
+    uname.value = qaPref.litmus.getUsername() || '';
+    passwd.value = qaPref.litmus.getPassword() || '';
+    if (qaPref.litmus.getUsername()) {
+      document.getElementById("qa-setup-account-haveaccount").selectedIndex=1;
+      document.getElementById('qa-setup-accountyes').style.display = '';
+    }
+    document.getElementById('qa-setup-createaccount-iframe').src =
+      litmus.baseURL+'extension.cgi?createAccount=1';
+  },
+
+  accountSetting : function(yesno) {
+    var accountyes = document.getElementById('qa-setup-accountyes');
+    var accountno = document.getElementById('qa-setup-accountno');
+    qaSetup.hideAccountSettings();
+    if (yesno == '0') {
+      accountno.style.display = '';
+    } else {
+      accountyes.style.display = '';
+    }
+  },
+  retrieveAccount : function(frameid, loadingid) {
+    var page = document.getElementById(frameid).contentDocument;
+    if (!page) {
+      alert("create account page is missing");
+      return false;
+    }
+    if (page.wrappedJSObject == null)
+      page.wrappedJSObject = page;
+    if (page.forms[0] && page.forms[0].wrappedJSObject == null)
+      page.forms[0].wrappedJSObject = page.forms[0];
+
+    if (loadingid && page.location == litmus.baseURL+'extension.cgi?createAccount=1'
+        && qaSetup.didSubmitForm==0) {
+        document.getElementById('loadingid').value =
+  document.getElementById("bundle_qa").getString("qa.extension.prefs.loadingMsg");
+      page.forms[0].wrappedJSObject.submit();
+      qaSetup.didSubmitForm = 1;
+      setTimeout("qaSetup.validateAccount()", 5000);
+      return false;
+    }
+    if (qaSetup.didSubmitForm == 1 && ! page.forms ||
+       ! page.forms[0].wrappedJSObject ||
+       ! page.forms[0].wrappedJSObject.email &&
+       ! page.forms[0].wrappedJSObject.email.value)
+        {qaSetup.didSubmitForm = 2;
+        setTimeout("qaSetup.validateAccount()", 4000);
+        return false;}
+    var e = '';
+    var p = '';
+    if (page.forms && page.forms[0].wrappedJSObject &&
+        page.forms[0].wrappedJSObject.email &&
+      page.forms[0].wrappedJSObject.email.value)
+      { e=page.forms[0].wrappedJSObject.email.value }
+    if (page.forms && page.forms[0].wrappedJSObject &&
+        page.forms[0].wrappedJSObject.password &&
+      page.forms[0].wrappedJSObject.password.value)
+      { p=page.forms[0].wrappedJSObject.password.value }
+
+    return { name : e, password : p};
+  },
+  validateAccount : function() {
+    if (document.getElementById('qa-setup-accountno').style.display == '') {
+      var account = qaSetup.retrieveAccount("qa-setup-createaccount-iframe", "qa-setup-accountconfirmloading");
+      document.getElementById('username').value = account.name;
+      document.getElementById('password').value = account.password;
+    }
+
+    document.getElementById('qa-setup-accountconfirmloading').value =
+  document.getElementById("bundle_qa").getString("qa.extension.prefs.loadingMsg");
+
+    var uname = document.getElementById('username').value;
+    var passwd = document.getElementById('password').value;
+
+    var callback = function(resp) {
+      if (resp.responseText != 1) { // failure
+        alert(document.getElementById("bundle_qa").
+          getString("qa.extension.prefs.loginError"));
+          document.getElementById('qa-setup-accountconfirmloading').value = null;
+        return false;
+      } else { // all's well
+        qaPref.litmus.setPassword(uname, passwd);
+        document.getElementById('qa-setup-accountconfirmloading').value = null;
+        document.getElementById('qa-setup').pageIndex++; // advance
+        return true;
+      }
+    }
+    litmus.validateLogin(uname, passwd, callback);
+    return false; // not ready to advance yet
+  },
+
+  loadSysconfig : function() {
+    $('qa-setup-sysconfig-loading').value =
+      $("bundle_qa").getString("qa.extension.sysconfig.loadingMsg");
+
+    var guessInfo = function() {
+      var sysconfig;
+      try {
+        sysconfig = new Sysconfig();
+      } catch (ex) {}
+      var platItems = $('qa-setup-platform').menupopup.childNodes;
+      for (var i=0; i<platItems.length; i++) {
+        if (sysconfig.platform && platItems[i].label == sysconfig.platform)
+          $('qa-setup-platform').selectedIndex = i;
+      }
+      var opsysItems = $('qa-setup-opsys').menupopup.childNodes;
+      for (var i=0; i<opsysItems.length; i++) {
+        if (sysconfig.opsys && opsysItems[i].label == sysconfig.opsys)
+          $('qa-setup-opsys').selectedIndex = i;
+      }
+      $('qa-setup-sysconfig-loading').value = '';
+    };
+
+    qaTools.loadJsonMenu(litmus.baseURL+"/json.cgi?platforms=1",
+        $('qa-setup-platform'), 'name', 'name');
+      qaTools.loadJsonMenu(litmus.baseURL+"/json.cgi?opsyses=1",
+        $('qa-setup-opsys'), 'name', 'name', guessInfo);
+  },
+
+  validateSysconfig : function() {
+    var sysconfig;
+    try {
+      sysconfig = new Sysconfig();
+    } catch (ex) {}
+
+    // only set prefs for things which differ from the automatically
+    // detected sysconfig for forward-compatibility
+    if (! sysconfig.platform == $('qa-setup-platform').selectedItem.label) {
+      qaPref.setPref(qaPref.prefBase+'.sysconfig.platform',
+            $('qa-setup-platform').selectedItem.label, 'char');
+    }
+    if (! sysconfig.opsys == $('qa-setup-opsys').selectedItem.label) {
+      qaPref.setPref(qaPref.prefBase+'.sysconfig.opsys',
+            $('qa-setup-opsys').selectedItem.label, 'char');
+    }
+    return true;
+  },
+
+  finish : function() {
+    qaPref.setPref(qaPref.prefBase+'.isFirstTime', false, 'bool');
+  }
 };
--- a/testing/extensions/community/chrome/content/setup.xul
+++ b/testing/extensions/community/chrome/content/setup.xul
@@ -1,60 +1,60 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is Zach Lipton.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+- ***** BEGIN LICENSE BLOCK *****
+- Version: MPL 1.1/GPL 2.0/LGPL 2.1
+-
+- The contents of this file are subject to the Mozilla Public License Version
+- 1.1 (the "License"); you may not use this file except in compliance with
+- the License. You may obtain a copy of the License at
+- http://www.mozilla.org/MPL/
+-
+- Software distributed under the License is distributed on an "AS IS" basis,
+- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+- for the specific language governing rights and limitations under the
+- License.
+-
+- The Original Code is the Mozilla Community QA Extension
+-
+- The Initial Developer of the Original Code is the Mozilla Corporation.
+- Portions created by the Initial Developer are Copyright (C) 2007
+- the Initial Developer. All Rights Reserved.
+-
+- Contributor(s):
+-   Zach Lipton <zach@zachlipton.com>
+-
+- Alternatively, the contents of this file may be used under the terms of
+- either the GNU General Public License Version 2 or later (the "GPL"), or
+- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+- in which case the provisions of the GPL or the LGPL are applicable instead
+- of those above. If you wish to allow use of your version of this file only
+- under the terms of either the GPL or the LGPL, and not to allow others to
+- use your version of this file under the terms of the MPL, indicate your
+- decision by deleting the provisions above and replace them with the notice
+- and other provisions required by the LGPL or the GPL. If you do not delete
+- the provisions above, a recipient may use your version of this file under
+- the terms of any one of the MPL, the GPL or the LGPL.
+-
+- ***** END LICENSE BLOCK ***** -->
 
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://qa/skin/" type="text/css"?>
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
 <wizard
  id="qa-setup"
  title="&qa.setup.title;"
  height="625"
  width="850"
  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
  xmlns:html="http://www.w3.org/1999/xhtml">
- 
+
 <stringbundleset id="stringbundleset">
   <stringbundle id="bundle_qa" src="chrome://qa/locale/qa.properties" />
 </stringbundleset>
 
 <script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
 <script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
 <script type="application/x-javascript" src="chrome://qa/content/common.js" />
 <script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
@@ -74,40 +74,40 @@
   <description>&qa.setup.accounttext;</description>
   <spacer height="20px" />
   <label value="&qa.setup.haveaccount;"/>
   <radiogroup id="qa-setup-account-haveaccount">
     <radio value="0" label="&qa.setup.accountno;" onclick="qaSetup.accountSetting('0');"/>
     <radio value="1" label="&qa.setup.accountyes;" onclick="qaSetup.accountSetting('1');"/>
   </radiogroup>
   <spacer height="20px" />
-  
+
   <vbox id="qa-setup-accountyes" style="display: none;">
     <label value="&qa.setup.accountyes.enterinfo;"/>
     <groupbox>
       <hbox>
         <vbox>
-		  <label control="username" value="&qa.preferences.litmus.username;"/>
-		  <textbox id="username" size="35"/>
-		  <label control="password" value="&qa.preferences.litmus.password;"/>
-		  <textbox id="password" type="password" size="35"/>
+          <label control="username" value="&qa.preferences.litmus.username;"/>
+          <textbox id="username" size="35"/>
+          <label control="password" value="&qa.preferences.litmus.password;"/>
+          <textbox id="password" type="password" size="35"/>
        </vbox>
      </hbox>
     </groupbox>
     <label id="qa-setup-accountconfirmloading"/>
   </vbox>
-  
+
   <vbox id="qa-setup-accountno" style="display: none;">
     <description>&qa.setup.accountno.text;</description>
     <html:iframe id="qa-setup-createaccount-iframe"
                  height="280"/>
   </vbox>
 </wizardpage>
 
-<wizardpage pageid="sysconfig" onpageshow="qaSetup.loadSysconfig();" 
+<wizardpage pageid="sysconfig" onpageshow="qaSetup.loadSysconfig();"
             label="&qa.setup.sysconfig.header;"
             onpageadvanced="return qaSetup.validateSysconfig();">
   <vbox>
     <description>&qa.setup.sysconfig.text;</description>
     <spacer height="20px" />
     <hbox>
     <label control="qa-setup-platform" value="&qa.setup.sysconfig.platform;"/>
     <menulist id="qa-setup-platform">
@@ -127,9 +127,9 @@
     <label id="qa-setup-sysconfig-loading"/>
   </vbox>
 </wizardpage>
 
 <wizardpage pageid="finish" onpageshow="qaSetup.finish();">
   <description>&qa.setup.accountdone;</description>
 </wizardpage>
 
-</wizard>
\ No newline at end of file
+</wizard>
new file mode 100644
--- /dev/null
+++ b/testing/extensions/community/chrome/content/tabs/bugAccess.js
@@ -0,0 +1,325 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the buggybar extension.
+ *
+ * The Initial Developer of the Original Code is
+ *  David Hamp-Gonsalves
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * David Hamp-Gonsalves
+ * Ben Hsieh <ben.hsieh@gmail.com> (modified for the QA Community Extension)
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+
+//bugAccess Class
+//used to comunicate with the bugzilla server, this will eventually be
+//an interface so the webservices version can be pluged in here if the
+//bugzilla instance supports it.  Right now the http/xml version is used
+
+
+function bugAccess()
+{
+  var onloadBugList;
+  var onloadBugSpecs;
+  var onloadBugSearch;
+  var onloadBugSave;
+  var onloadLogin;
+
+
+  this.getBugSpecs = function(inputId,inUrl,onloadFunc)
+  {
+    if(onloadFunc!=undefined)
+    {
+      onloadBugSpecs = onloadFunc;
+    }else
+      alert("ERROR: getBugList called without function parameter");
+    var url = inUrl+"show_bug.cgi?ctype=xml&id=";
+    //get bug id and create URL
+    url += inputId;
+
+    //TODO: need pop alert if connect can't be made(onerror)
+    var xmlHttp=new XMLHttpRequest();
+    xmlHttp.open("GET", url, true);
+
+
+    var req=new XMLHttpRequest();
+    req.open("GET", url, true);
+    var callback = this.parseBugSpecs;
+    req.onreadystatechange = function (aEvt) {
+    if (req.readyState == 4) {
+      if(req.status == 200) {
+//           alert(req.responseXML);
+       callback(req);
+    }else
+           alert("Error loading page\n");
+    }
+    };
+    req.send(null);
+
+
+    // leave true for Gecko
+    xmlHttp.send(null);
+
+    //xmlHttp.onload=this.parseBugSpecs;
+  }
+  //parse individual bug page
+  this.parseBugSpecs = function(e)
+  {
+    var bugInfo = new Object();
+    //var xml = e.target.responseXML;
+    var xml = e.responseXML;
+  //  	alert(xml);
+
+    if(xml.getElementsByTagName("bug")[0].getAttribute("error")!=null)
+    {
+      alert("The requested bug was: "+ xml.getElementsByTagName("bug")[0].getAttribute("error"));
+      bugInfo["id"] = "";
+      bugInfo["title"] = "";
+      bugInfo["status"] = "";
+      bugInfo["info"] = "";
+
+    }else
+    {
+      bugInfo["id"] = xml.getElementsByTagName("bug_id")[0].firstChild.data;
+      bugInfo["title"] = xml.getElementsByTagName("short_desc")[0].firstChild.data;
+      bugInfo["status"] = xml.getElementsByTagName("bug_status")[0].firstChild.data
+      if (xml.getElementsByTagName("resolution").length)
+        bugInfo["status"] += "--" + xml.getElementsByTagName("resolution")[0].firstChild.data;
+      bugInfo["info"] = xml.getElementsByTagName("short_desc")[0].firstChild.data + "\n\n"
+                + xml.getElementsByTagName("thetext")[0].firstChild.data;
+    }
+
+    onloadBugSpecs(bugInfo);
+  }
+
+  this.setBugListOnloadFunc = function(onloadFunc){onloadBugList = onloadFunc;}
+
+  this.setBugSearchOnloadFunc = function(onloadFunc){onloadBugSearch = onloadFunc;}
+
+  // get list of bugs html page
+  this.getBugList = function(inURL, params, mode)
+  {
+    var xmlHttp=new XMLHttpRequest();
+    xmlHttp.open("GET", inURL+"/buglist.cgi?"+params, true);
+
+    dump("searching: " + inURL+"/buglist.cgi?"+params);
+    // leave true for Gecko
+    xmlHttp.send(null);
+    if(mode == 1)//list mode
+      xmlHttp.onload=this.parseBugList;
+    else if(mode == 0)//search mode
+      xmlHttp.onload=this.parseBugSearch;
+  }
+
+
+  this.parseBugList = function(e)
+  {
+    var bugData = parseList(e.target.responseText);
+    onloadBugList(bugData);
+  }
+
+  this.parseBugSearch = function(e)
+  {
+    var bugData = parseList(e.target.responseText);
+    onloadBugSearch(bugData);
+  }
+
+  this.writeBugToBugzilla = function(inUrl,bugSpec,fn)
+  {
+    onloadBugSave=fn;
+
+  var names = new Array(bugSpecs.getFieldTotal());
+  names[0]="id";
+  names[1]="product";
+  names[2]="component";
+  names[3]="status";
+  names[4]="resolution";
+  names[5]="assigned_to";
+  names[6]="rep_platform";
+  names[7]="op_sys";
+  names[8]="version";
+  names[9]="priority";
+  names[10]="bug_severity";
+  names[11]="target_milestone";
+  names[12]="reporter";
+  names[13]="qa_contact";
+  names[14]="bug_file_loc";
+  names[15]="short_desc";
+
+  var fieldCount = bugSpecs.getFieldTotal();
+  var varString="";
+
+  for(i=0;i<fieldCount-1;i++)
+  {
+    if(names[i]!="reporter")
+      varString+=names[i]+"="+bugSpec.getSpec(i)+"&";
+  }
+
+  varString+="longdesclength=&knob="+bugSpec.getKnob();
+
+
+  var xmlHttp=new XMLHttpRequest();
+
+  xmlHttp.open("POST", inUrl+"/process_bug.cgi",true);
+
+  xmlHttp.setRequestHeader("Method", "POST "+inUrl+"/process_bug.cgi"+" HTTP/1.1");
+  xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
+
+
+  xmlHttp.send(varString);
+  //xmlHttp.onreadystatechange = this.writeBugToBugzillaStatus;
+  xmlHttp.onload = this.writeBugToBugzillaReturnStatus;
+}
+
+  this.writeBugToBugzillaReturnStatus = function(e)
+  {
+    if (e.target.readyState == 4)
+     {
+
+      if (e.target.status == 200)
+       {
+        var start;//will hold first pos of error search string from responce text if its an error page
+         //window._content.document.write("<b> the responce status is: </b>"+self.xmlHttp.status+"<br/>");
+        if(e.target.responseText.indexOf('name="Bugzilla_login">')!=-1)
+        {
+          //login page returned which means user isn't logged in
+          alert("Your not logged in to this instance of bugzilla");
+        }else if(e.target.responseText.indexOf('Bug processed')!=-1)
+        {
+          var success = "Changes Made";
+
+          alert(success);
+        }else if((start = e.target.responseText.indexOf('<td bgcolor="#ff0000">'))!=-1)
+        {
+          //error was recieved
+          var error = "Error: "+e.target.responseText.substring(start,e.target.responseText.indexOf('</td>'));
+          error = error.replace(/\n|\t|/g,"");
+          error = error.replace(/<[^>]+>/g,"");
+          error = getCleanText(error);
+          alert(error);
+        }
+
+       }else
+       {
+        alert("Connection failed! possible network error");
+       }
+
+      onloadBugSave();
+
+     }else
+     {
+      //at one of the load phases before 4
+      alert("load phase: "+e.target.readyState);
+    }
+  }
+
+  this.loginToBugzilla = function(inUrl, user, passwd, fn)
+  {
+    onloadLogin = fn;
+
+    var varString = "&Bugzilla_login="+user+"&Bugzilla_password="+passwd;
+
+    var xmlHttp=new XMLHttpRequest();
+
+    xmlHttp.open("POST", inUrl+"/index.cgi?GoAheadAndLogIn=1",true);
+
+    xmlHttp.setRequestHeader("Method", "POST "+inUrl+"/index.cgi"+" HTTP/1.1");
+    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
+
+    xmlHttp.send(varString);
+    xmlHttp.onload = this.loginToBugzillaStatus;
+
+  }
+
+  this.loginToBugzillaStatus = function(e)
+  {
+    //1 - success, -1 - failure, 0 - error unknown state
+    var rc=0;
+
+    var start;//will hold first pos of error search string from responce text if its an error page
+    if(e.target.responseText.indexOf('href="relogin.cgi"')!=-1)//success
+    {
+      //success
+      rc=1;
+      alert("Login successful");
+
+    }else if(e.target.responseText.toLowerCase().indexOf('invalid username or password')!=-1)//failure
+    {
+      rc=-1;
+      alert("Bugzilla reported that your user name or password was invalid please verify");
+    }
+
+    onloadLogin(rc);
+
+  }
+
+  }
+
+  //Kludge: couldn't find this fn when inside bugAccess for some reason ahould be moved to bug access class
+  //parse list of bugs html page and return array with ids and descriptions
+  function parseList(xmlHttp)
+  {
+  var beginLoc=0;
+  var endLoc=0;
+  var id;
+  var summary;
+
+  bugData=new Array();
+  //dump(xmlHttp);
+  for(var i = 0;(beginLoc = xmlHttp.indexOf('show_bug.cgi?id',endLoc)) != -1; i++)
+  {
+    endLoc = xmlHttp.indexOf('"',beginLoc);
+    beginLoc = xmlHttp.indexOf('=',beginLoc);
+
+    id=xmlHttp.substring(beginLoc+1, endLoc);
+
+
+    //move past other entries to get to summary
+    var curLoc=endLoc;
+
+    endLoc = xmlHttp.indexOf('</tr>',endLoc);
+    endLoc = xmlHttp.lastIndexOf('</td>',endLoc);
+    beginLoc = xmlHttp.lastIndexOf("<td >",endLoc);
+    if(beginLoc==-1)
+    {
+      beginLoc = xmlHttp.lastIndexOf("<td>",endLoc);//other option
+    }
+
+    summary = xmlHttp.substring(beginLoc, endLoc);
+
+    summary = getCleanText(summary);
+    bugData[i] = new Array(2);
+    bugData[i][0] = id;
+    bugData[i][1] = summary;
+    //alert("loop:" + i);
+  }
+  //alert("end loop:" + bugData, bugData.length);
+  return bugData;
+}
new file mode 100644
--- /dev/null
+++ b/testing/extensions/community/chrome/content/tabs/bugzilla.js
@@ -0,0 +1,205 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Ben Hsieh <ben.hsieh@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+* ***** END LICENSE BLOCK ***** */
+
+var bugzilla = {
+    trunkVersion : "3.0",
+    baseURL : qaPref.getPref(qaPref.prefBase+".bugzilla.url", "char"),
+    sysconfig: null,
+    bugReader : null,
+    doSearch : function() {
+
+        var words = $("qa-bugzilla-input-keywords").value;
+        var bugId = $("qa-bugzilla-input-id").value;
+
+        if ($("qa-bugzilla-radio-words").selected) { // keyword search
+
+            if ($("qa-bugzilla-input-os").checked && words.indexOf("os:") == -1) {
+                if (bugzilla.sysconfig == null) bugzilla.sysconfig = new Sysconfig();
+                words += " os:" + bugzilla.sysconfig.opsys.substr(0,3);
+            }
+            if ($("qa-bugzilla-input-version").checked && words.indexOf("version:") == -1) {
+                if (bugzilla.sysconfig == null) bugzilla.sysconfig = new Sysconfig();
+                var branch = bugzilla.sysconfig.branch.substr(0,3);
+                if (branch.indexOf(bugzilla.trunkVersion) != -1) branch = "Trunk";
+
+                words += " version:" + branch;
+            }
+
+            bugzilla.loadBugGroup(words);
+        } else {  //id search
+            bugzilla.loadBug(bugId);
+        }
+    },
+    showRecent : function() {
+        $("qa-bugzilla-input-radiogroup").selectedItem = $("qa-bugzilla-radio-words");
+        bugzilla.disableOther();
+        bugzilla.loadBugGroup("product=Core&product=Firefox&product=Mozilla+Application+Suite&product=Thunderbird&product=Toolkit"
+                              +"&bug_status=UNCONFIRMED,NEW,ASSIGNED,REOPENED,RESOLVED&chfield=%5BBug%20creation%5D&chfieldfrom=-24h"
+                              , true);
+    },
+    loadBugGroup : function (param, detailsearch) {
+        var callback = function(bugarray) {  // bugarray is a 2d array with id and summaries
+
+                var menu = document.getElementById('bugSearchList');
+                while (menu.getRowCount()) {  // clear menu
+                    menu.removeItemAt(0);
+                };
+
+                for (var i = 0; i < bugarray.length; i++) {
+                    var row = document.createElement("listitem");
+                    row.value = bugarray[i][0];
+                    var number = document.createElement("listcell");
+                    number.setAttribute("label", bugarray[i][0]);
+                    var name = document.createElement("listcell");
+                    name.setAttribute("label", bugarray[i][1]);
+                    name.setAttribute("crop", "end");
+                    name.setAttribute("maxwidth", "175");
+                    row.appendChild(number);
+                    row.appendChild(name);
+                    menu.appendChild(row);
+                }
+
+                if(bugarray.length) menu.selectedIndex = 0;
+
+                $("qa-bugzilla-input-keywords").value = param;
+                if ($('qa_tabrow').selectedItem != $('qa-tabbar-bugzilla')) {
+                    bugzilla.highlightTab();
+                }
+            }
+
+            if (bugzilla.bugReader == null) bugzilla.bugReader = new bugAccess();
+            bugzilla.bugReader.setBugSearchOnloadFunc(callback);
+
+            if (detailsearch) bugzilla.bugReader.getBugList(bugzilla.baseURL, "buglist.cgi?="+param, 0);
+            else bugzilla.bugReader.getBugList(bugzilla.baseURL, "quicksearch="+param, 0);
+    },
+    loadBug : function (bugId, preserveCurrent) {
+        var callback = function(bugObj) {
+            // menu
+            var menu = document.getElementById('bugSearchList');
+            while (menu.getRowCount() && !preserveCurrent) {  // clear menu
+                menu.removeItemAt(0);
+            };
+
+            var row = document.createElement("listitem");
+            row.value = bugObj["id"];
+            var number = document.createElement("listcell");
+            number.setAttribute("label", bugObj["id"]);
+            var name = document.createElement("listcell");
+            name.setAttribute("label", bugObj["title"]);
+            name.setAttribute("crop", "end");
+            name.setAttribute("maxwidth", "175");
+            row.appendChild(number);
+            row.appendChild(name);
+            menu.appendChild(row);
+
+            // summary
+            $("qa-bugzilla-input-id").value = $("qa-bugzilla-output-id").value = bugObj["id"];
+            $("qa-bugzilla-output-status").value = bugObj["status"];
+            $("qa-bugzilla-output-summary").value = bugObj["info"];
+
+            qaTools.assignLinkHandlers($("qa-bugzilla-output-summary"));
+
+            if ($('qa_tabrow').selectedItem != $('qa-tabbar-bugzilla')) {
+                bugzilla.highlightTab();
+            }
+        }
+        if (bugzilla.bugReader == null) bugzilla.bugReader = new bugAccess();
+        bugzilla.bugReader.getBugSpecs(bugId, bugzilla.baseURL, callback);
+    },
+    disableOther : function() {
+        if ($("qa-bugzilla-radio-words").selected) {
+            $("qa-bugzilla-input-keywords").disabled = false;
+            $("qa-bugzilla-input-os").disabled = false;
+            $("qa-bugzilla-input-version").disabled = false;
+            $("qa-bugzilla-input-id").disabled = true;
+        } else {
+            $("qa-bugzilla-input-id").disabled = false;
+            $("qa-bugzilla-input-keywords").disabled = true;
+            $("qa-bugzilla-input-os").disabled = true;
+            $("qa-bugzilla-input-version").disabled = true;
+        }
+    },
+    handleSelect : function() {
+        var menu = $('bugSearchList');
+        if (menu.selectedItem.value == $("qa-bugzilla-output-id").value) return;
+
+        var callback = function(bugObj) {
+            $("qa-bugzilla-output-id").value = bugObj["id"];
+            $("qa-bugzilla-output-status").value = bugObj["status"];
+            $("qa-bugzilla-output-summary").value = bugObj["info"];
+        }
+        if (bugzilla.bugReader == null) bugzilla.bugReader = new bugAccess();
+        bugzilla.bugReader.getBugSpecs(menu.selectedItem.value, bugzilla.baseURL, callback);
+    },
+    highlightTab : function() {
+        $('qa-tabbar-bugzilla').className = "tabbrowser-tab highlight";
+    },
+    unhighlightTab : function() {
+        $('qa-tabbar-bugzilla').className = "tabbrowser-tab";
+    },
+    openInBugzilla : function() {
+        if ($("qa-bugzilla-output-id").value == "") {
+            alert("no value");
+            return;
+        }
+        var url = bugzilla.baseURL + "show_bug.cgi?id=" + $("qa-bugzilla-output-id").value;
+
+        var type = qaPref.getPref("browser.link.open_external", "int");
+        var where = "tab";
+        if (type == 2) where = "window";
+
+        openUILinkIn(url, where);
+    },
+    findBugzillaLinks : function(node) {  // assumes HTML-ns node
+        var RV = new Array();
+        var innerstr = node.innerHTML;
+
+        var prefix = "show_bug.cgi?id=";
+        var index = innerstr.indexOf(prefix);
+        dump(innerstr);
+        if (index == -1) {
+            //TODO: search for "bug"? is that too broad?
+        } else {
+            while(index != -1) {
+                RV.push(innerstr.substr(index+prefix.length,6));
+                dump(RV.length + " found so far, current index: " + index+ " \n");
+                index = innerstr.indexOf(prefix, index + 1);
+            }
+        }
+        return qaTools.makeUniqueArray(RV);
+    }
+}
--- a/testing/extensions/community/chrome/content/tabs/bugzilla.xul
+++ b/testing/extensions/community/chrome/content/tabs/bugzilla.xul
@@ -1,76 +1,116 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*   Ben Hsieh <ben.hsieh@gmail.com>  (rewrite)
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa-bz-overlay" 
+<overlay id="qa-bz-overlay"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml">
-
 <tabpanel id="qa-tab-bugzilla">
 <vbox>
+  <label href="http://bugzilla.mozilla.org"
+         value="Help us by filing and confirming bugs in Bugzilla"
+         class="text-link" />
   <groupbox>
+    <caption label="Bug Search" />
+      <radiogroup id = "qa-bugzilla-input-radiogroup"
+                  onselect="bugzilla.disableOther()">
+      <hbox>
+        <radio selected="true" id="qa-bugzilla-radio-id"
+                   label="Bug id:" width="100px" />
+         <textbox width="200px" id="qa-bugzilla-input-id" />
+      </hbox>
+      <hbox><radio id="qa-bugzilla-radio-words" label="Keywords:" width="100px" />
+          <textbox width="200px" disabled="true" id="qa-bugzilla-input-keywords" /> </hbox>
+      </radiogroup>
+      <hbox>
+          <checkbox id="qa-bugzilla-input-os" label="Include OS" />
+          <checkbox id="qa-bugzilla-input-version" label="Include Version" />
+      </hbox>
+      <spacer height="20px" />
+      <hbox>
+        <button label="Find!" oncommand="bugzilla.doSearch(); "/>
+         <button label="Show all bugs filed today"
+                 oncommand="bugzilla.showRecent()"/></hbox>
+  </groupbox>
+
+  <listbox id="bugSearchList" onselect="bugzilla.handleSelect();"
+           flex="1" seltype="single" maxheight="200px" height="200px">
+  <listhead>
+    <listheader label="Id"/>
+    <listheader label="Summary"/>
+    </listhead>
+
+    <listcols>
+    <listcol/>
+    <listcol flex="1"/>
+    </listcols>
+  </listbox>
+<!--  <groupbox>
     <div xmlns="http://www.w3.org/1999/xhtml" id="qa-bz-bugzilla">
     </div>
+</groupbox> -->
+  <groupbox>
+    <caption label= "Bug Summary" />
+    <hbox>
+      <label width="100px"> Bug id: </label>
+      <textbox style="color:black" id="qa-bugzilla-output-id"
+             width="197px" cols="31" disabled="true"/>
+    </hbox>
+    <hbox>
+      <label width="100px"> Status: </label>
+      <textbox style="color:black" id="qa-bugzilla-output-status"
+             width="197px" cols="31" disabled="true"/>
+    </hbox>
+    <hbox>
+      <label width="100px"> Summary: </label>
+      <textbox style="color:black" id="qa-bugzilla-output-summary"
+               width="197px" multiline="true" disabled="true" height="100px" rows="7"/> </hbox>
+    <hbox>
+      <spacer width="110px" />
+      <button label="Show in Bugzilla" width="200px"
+              oncommand="bugzilla.openInBugzilla();"/>
+    </hbox>
   </groupbox>
+  <spacer height= "20px" />
+
 </vbox>
 </tabpanel>
 
-<script type="application/x-javascript">
-	var bz = {
-		populateFields : function() {
-			var box = $('qa-bz-bugzilla');
-			qaTools.showHideLoadingMessage(box, true);
-			qaTools.fetchFeed(qaMain.urlbundle.getString("qa.extension.url.bz.content"), 
-				function(feed) {
-					var items = feed.items;
-					var item = items.queryElementAt(0, Ci.nsIFeedEntry);
-					qaTools.showHideLoadingMessage(box, false);
-					if (item != null) {
-						var fragment = item.summary.createDocumentFragment(box);
-						box.appendChild(fragment);
-					}
-				}
-			);
-		}
-	};
-	window.addEventListener('load', bz.populateFields, false);
-</script>
-
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/tabs/chat.xul
+++ b/testing/extensions/community/chrome/content/tabs/chat.xul
@@ -1,87 +1,91 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa-qmo-overlay" 
+<overlay id="qa-qmo-overlay"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml">
 
 
-<script type="application/x-javascript" 
-	src="chrome://chatzillaservice_qa/content/chatzilla-service.js" />
+<script type="application/x-javascript"
+  src="chrome://chatzillaservice_qa/content/chatzilla-service.js" />
 <script type="application/x-javascript" >
-    window.addEventListener('load', function() {
-    	qaTools.assignLinkHandler($("qa-chat-imo"));
-        qaTools.assignLinkHandler($("qa-chat-irchelp"));
-    }, false);
+  window.addEventListener('load', function() {
+    qaTools.assignLinkHandler($("qa-chat-imo"));
+    qaTools.assignLinkHandler($("qa-chat-irchelp"));
+  }, false);
 </script>
 
 <tabpanel id="qa-tab-chat">
 <vbox>
-  
+
   <groupbox style="width:350px;">
     <caption label="&qa.chat.introtitle;" />
     <description>&qa.chat.intro;</description>
     <spacer style="height: 1em;" />
     <description>&qa.chat.intro2;</description>
   </groupbox>
-  
+
   <groupbox style="width:350px;">
     <caption label="&qa.chat.howdoItitle;" />
     <div xmlns="http://www.w3.org/1999/xhtml" id="qa-qmo-forumposts">
       <ul>
-        <li><a id="qa-chat-imo" href="&qa.chat.howdoI.imourl;" target="_blank">&qa.chat.howdoI.imo;</a></li>
-        <li><a id="qa-chat-irchelp" href="&qa.chat.howdoI.irchelpurl;" target="_blank">&qa.chat.howdoI.irchelp;</a></li>
+        <li><a id="qa-chat-imo" href="&qa.chat.howdoI.imourl;" target="_blank">
+            &qa.chat.howdoI.imo;</a>
+        </li>
+        <li><a id="qa-chat-irchelp" href="&qa.chat.howdoI.irchelpurl;" target="_blank">
+            &qa.chat.howdoI.irchelp;</a>
+        </li>
       </ul>
     </div>
     <button style="margin-top: 12px; padding-left: 2em; padding-right: 2em;"
-      	oncommand="openQAChat();" label="&qa.chat.howdoI.joinnow;" />
+        oncommand="openQAChat();" label="&qa.chat.howdoI.joinnow;" />
   </groupbox>
-  
+
   <script type="application/x-javascript">
     function openQAChat() {
-    	spawnChatZilla('irc://irc.mozilla.org/qa', 0);
+      spawnChatZilla('irc://irc.mozilla.org/qa', 0);
     }
   </script>
-  
+
 </vbox>
 </tabpanel>
 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/tabs/help.xul
+++ b/testing/extensions/community/chrome/content/tabs/help.xul
@@ -1,57 +1,57 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa-help-overlay" 
+<overlay id="qa-help-overlay"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml">
 
 <script type="application/x-javascript" src="chrome://qa/content/tabs/qa.js" />
 <tabpanel id="qa-tab-help">
 <vbox>
   <groupbox>
     <div xmlns="http://www.w3.org/1999/xhtml" id="qa-bz-bugzilla">
       Help coming soon.
     </div>
   </groupbox>
 </vbox>
 </tabpanel>
 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/tabs/litmus.xul
+++ b/testing/extensions/community/chrome/content/tabs/litmus.xul
@@ -1,118 +1,127 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*-  
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#   Ben Hsieh <bhsieh@mozilla.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*  Ben Hsieh <bhsieh@mozilla.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
-<?xml-stylesheet href="chrome://qa/skin/" type="text/css"?>
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 <!ENTITY % xhtmlDTD SYSTEM "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> %xhtmlDTD;
 ]>
 
 <overlay id="qa-litmus-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <tabpanel id="qa-tab-litmus" onload="litmus.readStateFromPref();">
-		
+
 <vbox align="start" pack="start">
-	<hbox align="start" pack="start">
-		<vbox minwidth="150">
-			 <button maxwidth="110" label="&qa.litmus.selecttests;"
+  <hbox align="start" pack="start">
+    <vbox minwidth="150">
+       <button maxwidth="110" label="&qa.litmus.selecttests;"
                      oncommand="litmus.handleDialog()"
                      style="margin-left: 4px;" />
-			 <label maxwidth="160" value="" id="qa-testrun-label"/>
-			 <label maxwidth="160" value="" id="qa-testgroup-label"/>
-			 <label maxwidth="160" value="" id="qa-subgroup-label"/>
+       <label maxwidth="160" value="" id="qa-testrun-label"/>
+       <label maxwidth="160" value="" id="qa-testgroup-label"/>
+       <label maxwidth="160" value="" id="qa-subgroup-label"/>
              <label value="" />
              <label value="" id="qa-testcase-progress" />
-		</vbox>
-		<listbox rows="7" minwidth="200" onselect="litmus.handleSelect()" id="testlist">
+    </vbox>
+    <listbox rows="7" minwidth="200" onselect="litmus.handleSelect()"
+             id="testlist">
             <listcols>
                 <listcol />
                 <listcol />
             </listcols>
             <listitem label="&qa.litmus.testlist.initiallabel;" />
-                
+
         </listbox>
-	 </hbox>
-	 <vbox>
-	   <hbox style="font-weight: bold;">
-	  	   <label id="qa-testcase-id" value="&qa.litmus.testlist.initialdescription;" />
-	  	   <label value="&mdash;" />
-           <description id="qa-testcase-summary" maxwidth="230px" crop="end"></description> 
-	   </hbox>
-	   
-	 </vbox>
-	 
-	
-	<vbox width="370px" minwidth="370px">
-		<groupbox maxheight="130px" minwidth="370px" width="370px">
-			<caption label="&qa.testcase.steps;" crop="end" maxwidth="200"/>
-			<div xmlns="http://www.w3.org/1999/xhtml" style="width: 350px; height: 140px; overflow: auto;" id="qa-testcase-steps" class="list"/>
-		</groupbox>
-		<splitter id="qa-mainwindow-splitter" state="open" collapse="none">
-			<grippy/>
-		</splitter>
-		<groupbox maxheight="120px" minwidth="370px" width="370px">
-			<caption label="&qa.testcase.expected;" />
-			<div xmlns="http://www.w3.org/1999/xhtml" style="width: 350px; height: 120px; overflow: auto;" id="qa-testcase-expected" class="list"/>
-		</groupbox>
-	</vbox>
-	<hbox>
-	<groupbox>
-		<caption label="Result:" />
-		<radiogroup id="qa-testcase-result">
-			<radio id="qa-testcase-pass" label="&qa.testcase.result.pass;"/>
-			<radio id="qa-testcase-fail" label="&qa.testcase.result.fail;"/>
-			<radio id="qa-testcase-unclearBroken" label="&qa.testcase.result.unclearbroken;"/>
-		</radiogroup>
-	</groupbox>
-	<groupbox>
-	<caption control="qa-testcase-comment" label="&qa.testcase.comment;"/>
-	<textbox id="qa-testcase-comment" style="min-height: 75px; width:150px;" class="plain"/>
+  </hbox>
+  <vbox>
+    <hbox style="font-weight: bold;">
+      <label id="qa-testcase-id" value="&qa.litmus.testlist.initialdescription;" />
+      <label value="&mdash;" />
+        <description id="qa-testcase-summary" maxwidth="230px" crop="end">
+         </description>
+    </hbox>
+
+  </vbox>
+
+
+  <vbox width="370px" minwidth="370px">
+    <groupbox maxheight="130px" minwidth="370px" width="370px">
+      <caption label="&qa.testcase.steps;" crop="end" maxwidth="200"/>
+      <div xmlns="http://www.w3.org/1999/xhtml"
+           style="width: 350px; height: 140px; overflow: auto;"
+           id="qa-testcase-steps" class="list"/>
     </groupbox>
-	</hbox>
-	<hbox flex="1" maxheight="30px">
-		 <button id="qa-mainwindow-previousButton" label="Previous" oncommand="litmus.prevButton()"/> 
-		<button id="qa-mainwindow-nextButton" label="Next (Submit)" oncommand="litmus.nextButton()"/>
-	</hbox>
+    <splitter id="qa-mainwindow-splitter" state="open" collapse="none">
+      <grippy/>
+    </splitter>
+    <groupbox maxheight="120px" minwidth="370px" width="370px">
+      <caption label="&qa.testcase.expected;" />
+      <div xmlns="http://www.w3.org/1999/xhtml"
+           style="width: 350px; height: 120px; overflow: auto;"
+           id="qa-testcase-expected" class="list"/>
+    </groupbox>
+  </vbox>
+  <hbox>
+  <groupbox>
+    <caption label="Result:" />
+    <radiogroup id="qa-testcase-result">
+      <radio id="qa-testcase-pass" label="&qa.testcase.result.pass;"/>
+      <radio id="qa-testcase-fail" label="&qa.testcase.result.fail;"/>
+      <radio id="qa-testcase-unclearBroken"
+             label="&qa.testcase.result.unclearbroken;"/>
+    </radiogroup>
+  </groupbox>
+  <groupbox>
+  <caption control="qa-testcase-comment" label="&qa.testcase.comment;"/>
+  <textbox id="qa-testcase-comment" rows="4" cols="30" multiline="true"
+           class="plain"/>
+    </groupbox>
+  </hbox>
+  <hbox flex="1" maxheight="30px">
+     <button id="qa-mainwindow-previousButton" label="Previous"
+             oncommand="litmus.prevButton()"/>
+    <button id="qa-mainwindow-nextButton" label="Next (Submit)"
+            oncommand="litmus.nextButton()"/>
+  </hbox>
   <label id="qa-litmus-stats" value="" />
   <script type="application/x-javascript">
     this.addEventListener('load', litmus.loadStats, false);
   </script>
 </vbox>
 </tabpanel>
 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/tabs/qmo.js
+++ b/testing/extensions/community/chrome/content/tabs/qmo.js
@@ -30,125 +30,125 @@
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 var qmo = {
-	populateFields : function() {
-		qmo.populateForumPosts();
-		qmo.populateEvents();
-		qmo.populateQMONews();
-		qmo.populateHowHelp();
-	},
-	populateForumPosts : function() {
-		var numPosts = 5; // show top 5 topics
-		var postBox = $('qa-qmo-forumposts');
-		qaTools.showHideLoadingMessage(postBox, true);
-		var url = qaMain.urlbundle.getString("qa.extension.url.qmo.forum_topics");
-		var callback = function(feed) {
-			var items = feed.items;
-			qaTools.showHideLoadingMessage(postBox, false);
-			if (items.length < numPosts) 
-				numPosts=items.length;
-			for (var i=0; i<numPosts; i++) {
-				var item = items.queryElementAt(i, Ci.nsIFeedEntry);
-				if (item != null) {
-					qmo.populateLinkBox(postBox, 
-						[{text : item.title.plainText(), url : item.link.resolve("")}], 
-						64);
-				}
-			}
-		};
-		qaTools.fetchFeed(url, callback);
-	},
-	populateEvents : function() {
-		var numEvents = 5; // show 5 events
-		var eventBox = $('qa-qmo-events');
-		qaTools.showHideLoadingMessage(eventBox, true);
-		var url = qaMain.urlbundle.getString("qa.extension.url.qmo.upcomingEvents");
-		var callback = function(feed) {
-			var items = feed.items;
-			qaTools.showHideLoadingMessage(eventBox, false);
-			if (items.length < numEvents)
-				numEvents=items.length;
-			for (var i=0; i<numEvents; i++) {
-				var item = items.queryElementAt(i, Ci.nsIFeedEntry);
-				if (item != null) {
-					qmo.populateLinkBox(eventBox, 
-						[{text : item.title.plainText(), url : item.link.resolve("")}], 
-						37);
-				}
-			}
-		};
-		qaTools.fetchFeed(url, callback);
-	},
-	populateQMONews : function() {
-		var box = $('qa-qmo-latest');
-		var url = qaMain.urlbundle.getString("qa.extension.url.qmo.news");
-		qaTools.showHideLoadingMessage(box, true);
-		var callback = function(feed) {
-			var items = feed.items;
-			var item = items.queryElementAt(0, Ci.nsIFeedEntry);
-			qaTools.showHideLoadingMessage(box, false);
-			if (item != null) { // just grab the first item
-				var content = item.summary;
-				var fragment = content.createDocumentFragment(box);
-				
-				box.appendChild(fragment);
-			}
-			qaTools.assignLinkHandlers(box);
-		}
-		qaTools.fetchFeed(url, callback);
-	},
-	populateHowHelp : function() {
-		var box = $('qa-qmo-help');
-		var url = qaMain.urlbundle.getString("qa.extension.url.qmo.howhelp");
-		qaTools.showHideLoadingMessage(box, true);
-		var callback = function(feed) {
-			var items = feed.items;
-			var item = items.queryElementAt(0, Ci.nsIFeedEntry);
-			qaTools.showHideLoadingMessage(box, false);
-			if (item != null) { // just grab the first item
-				var content = item.summary;
-				var fragment = content.createDocumentFragment(box);
-				
-				box.appendChild(fragment);
-			}
-			qaTools.assignLinkHandlers(box);
-		}
-		qaTools.fetchFeed(url, callback);
-	},
-	populateLinkBox : function(box, links, chars) {
-		var list = box.childNodes[1];
-		for (var i=0; i<links.length; i++) {
-			var elem = list.appendChild(document.createElementNS(qaMain.htmlNS,"li"));
-			var a = elem.appendChild(document.createElementNS(qaMain.htmlNS,"a"));
-			
-			// limit text to chars characters:
-			var text = links[i].text;
-			if (chars && chars>0 && text.length > chars) {
-				a.setAttribute("tooltiptext", text);
-				text = text.substring(0, chars-3)+"...";
-			}
-			
-			a.textContent = text;
-			a.href = links[i].url;
-			qaTools.assignLinkHandler(a);
-		}
-	},
+  populateFields : function() {
+    qmo.populateForumPosts();
+    qmo.populateEvents();
+    qmo.populateQMONews();
+    qmo.populateHowHelp();
+  },
+  populateForumPosts : function() {
+    var numPosts = 5; // show top 5 topics
+    var postBox = $('qa-qmo-forumposts');
+    qaTools.showHideLoadingMessage(postBox, true);
+    var url = qaMain.urlbundle.getString("qa.extension.url.qmo.forum_topics");
+    var callback = function(feed) {
+      var items = feed.items;
+      qaTools.showHideLoadingMessage(postBox, false);
+      if (items.length < numPosts)
+        numPosts=items.length;
+      for (var i=0; i<numPosts; i++) {
+        var item = items.queryElementAt(i, Ci.nsIFeedEntry);
+        if (item != null) {
+          qmo.populateLinkBox(postBox,
+            [{text : item.title.plainText(), url : item.link.resolve("")}],
+            64);
+        }
+      }
+    };
+    qaTools.fetchFeed(url, callback);
+  },
+  populateEvents : function() {
+    var numEvents = 5; // show 5 events
+    var eventBox = $('qa-qmo-events');
+    qaTools.showHideLoadingMessage(eventBox, true);
+    var url = qaMain.urlbundle.getString("qa.extension.url.qmo.upcomingEvents");
+    var callback = function(feed) {
+      var items = feed.items;
+      qaTools.showHideLoadingMessage(eventBox, false);
+      if (items.length < numEvents)
+        numEvents=items.length;
+      for (var i=0; i<numEvents; i++) {
+        var item = items.queryElementAt(i, Ci.nsIFeedEntry);
+        if (item != null) {
+          qmo.populateLinkBox(eventBox,
+            [{text : item.title.plainText(), url : item.link.resolve("")}],
+            37);
+        }
+      }
+    };
+    qaTools.fetchFeed(url, callback);
+  },
+  populateQMONews : function() {
+    var box = $('qa-qmo-latest');
+    var url = qaMain.urlbundle.getString("qa.extension.url.qmo.news");
+    qaTools.showHideLoadingMessage(box, true);
+    var callback = function(feed) {
+      var items = feed.items;
+      var item = items.queryElementAt(0, Ci.nsIFeedEntry);
+      qaTools.showHideLoadingMessage(box, false);
+      if (item != null) { // just grab the first item
+        var content = item.summary;
+        var fragment = content.createDocumentFragment(box);
+
+        box.appendChild(fragment);
+      }
+      qaTools.assignLinkHandlers(box);
+    }
+    qaTools.fetchFeed(url, callback);
+  },
+  populateHowHelp : function() {
+    var box = $('qa-qmo-help');
+    var url = qaMain.urlbundle.getString("qa.extension.url.qmo.howhelp");
+    qaTools.showHideLoadingMessage(box, true);
+    var callback = function(feed) {
+      var items = feed.items;
+      var item = items.queryElementAt(0, Ci.nsIFeedEntry);
+      qaTools.showHideLoadingMessage(box, false);
+      if (item != null) { // just grab the first item
+        var content = item.summary;
+        var fragment = content.createDocumentFragment(box);
+
+        box.appendChild(fragment);
+      }
+      qaTools.assignLinkHandlers(box);
+    }
+    qaTools.fetchFeed(url, callback);
+  },
+  populateLinkBox : function(box, links, chars) {
+    var list = box.childNodes[1];
+    for (var i=0; i<links.length; i++) {
+      var elem = list.appendChild(document.createElementNS(qaMain.htmlNS,"li"));
+      var a = elem.appendChild(document.createElementNS(qaMain.htmlNS,"a"));
+
+      // limit text to chars characters:
+      var text = links[i].text;
+      if (chars && chars>0 && text.length > chars) {
+        a.setAttribute("tooltiptext", text);
+        text = text.substring(0, chars-3)+"...";
+      }
+
+      a.textContent = text;
+      a.href = links[i].url;
+      qaTools.assignLinkHandler(a);
+    }
+  }
 };
 
 function $() {
   var elements = new Array();
   for (var i = 0; i < arguments.length; i++) {
     var element = arguments[i];
     if (typeof element == 'string')
       element = document.getElementById(element);
     if (arguments.length == 1)
       return element;
 
     elements.push(element);
   }
   return elements;
-}
\ No newline at end of file
+}
--- a/testing/extensions/community/chrome/content/tabs/qmo.xul
+++ b/testing/extensions/community/chrome/content/tabs/qmo.xul
@@ -1,93 +1,96 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa-qmo-overlay" 
+<overlay id="qa-qmo-overlay"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:html="http://www.w3.org/1999/xhtml">
 
 
 <script type="application/x-javascript">
   window.addEventListener('load', qmo.populateFields, false)
 </script>
 
 <tabpanel id="qa-tab-qmo">
 <vbox pack="start">
   <hbox>
     <html:a href="http://quality.mozilla.org" target="blank">
-      <image src='chrome://qa/skin/qmo-badge.png' 
-        style='max-width: 75px; max-height: 31px; margin-top: 3px; margin-left: 3px;' />
+      <image src='chrome://qa/skin/qmo-badge.png'
+        style='max-width: 75px; max-height: 31px;
+               margin-top: 3px; margin-left: 3px;' />
     </html:a>
   </hbox>
- 
-  
+
+
   <hbox class="box-mheight">
-	<groupbox  class="box-mheight">
-		<caption label="&qa.qmo.help;" />
-		<div class="box-mheight" xmlns="http://www.w3.org/1999/xhtml" id="qa-qmo-help">
-		</div>
-	</groupbox>
-	<groupbox class="box-mheight">
-		<caption label="&qa.qmo.events;" />
-		<div class="box-mheight" xmlns="http://www.w3.org/1999/xhtml" id="qa-qmo-events">
-			<ul>
-			</ul>
-		</div>
-	</groupbox>
+  <groupbox  class="box-mheight">
+    <caption label="&qa.qmo.help;" />
+    <div class="box-mheight" xmlns="http://www.w3.org/1999/xhtml"
+         id="qa-qmo-help">
+    </div>
+  </groupbox>
+  <groupbox class="box-mheight">
+    <caption label="&qa.qmo.events;" />
+    <div class="box-mheight" xmlns="http://www.w3.org/1999/xhtml"
+         id="qa-qmo-events">
+      <ul>
+      </ul>
+    </div>
+  </groupbox>
   </hbox>
   <groupbox>
     <caption label="&qa.qmo.forumposts;" />
     <div xmlns="http://www.w3.org/1999/xhtml" id="qa-qmo-forumposts">
       <ul>
       </ul>
     </div>
   </groupbox>
-  
+
   <groupbox id="qa-qmo-latestbox">
     <caption label="&qa.qmo.thelatest;" />
     <div xmlns="http://www.w3.org/1999/xhtml" id="qa-qmo-latest">
-	
+
     </div>
   </groupbox>
-  
+
 </vbox>
 </tabpanel>
 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/content/tabs/selecttests.js
+++ b/testing/extensions/community/chrome/content/tabs/selecttests.js
@@ -14,17 +14,17 @@
  * The Original Code is the Mozilla Community QA Extension
  *
  * The Initial Developer of the Original Code is the Mozilla Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2007
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *  Ben Hsieh <bhsieh@mozilla.com>
- *	Zach Lipton <zach@zachlipton.com>
+ *  Zach Lipton <zach@zachlipton.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -34,100 +34,103 @@
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
 * ***** END LICENSE BLOCK ***** */
 
 
 var updateFunction;
 var handleCancel;
 var handleOK;
-var sTestrunsWrapper; // an array of things that are kind of like testruns, but w/o important fields.
-					  //returned by "test_runs_by_branch_product_name="
+var sTestrunsWrapper; // an array of things that are kind of like testruns,
+                      // but w/o important fields.
+                      //returned by "test_runs_by_branch_product_name="
 
 var sTestrun;   // actual testrun
 var sTestgroup;
 function handleLoad() {
 
-	if (window.arguments.length > 0) {
-		updateFunction = window.arguments[0];   // parent window passes in a function to update itself with data
-		handleCancel = window.arguments[1];     // parent window passes in a function to restore state if dialog canceled
-		handleOK = window.arguments[2];         // you get the idea
-	} 
-	litmus.getTestruns(populateTestRuns);
+  if (window.arguments.length > 0) {
+    updateFunction = window.arguments[0];   // parent window passes in a function to update itself with data
+    handleCancel = window.arguments[1];     // parent window passes in a function to restore state if dialog canceled
+    handleOK = window.arguments[2];         // you get the idea
+  }
+  litmus.getTestruns(populateTestRuns);
 }
 
 function handleRunSelect() {
-	var id = document.getElementById("qa-st-testrun").selectedItem.getAttribute("value");
-	if (id == "") return;  // oddly, this check doesn't seem necessary in the other handlers...
-	litmus.getTestrun(id, populateTestGroups);
+  var id = $("qa-st-testrun").selectedItem.getAttribute("value");
+  if (id == "") return;
+    // oddly, this check doesn't seem necessary in the other handlers...
+  litmus.getTestrun(id, populateTestGroups);
 }
 
 function handleTestgroupSelect() {
-	var id = document.getElementById("qa-st-testgroup").selectedItem.value;
-	litmus.getTestgroup(id, populateSubgroups);
+  var id = document.getElementById("qa-st-testgroup").selectedItem.value;
+  litmus.getTestgroup(id, populateSubgroups);
 }
 
 function handleSubgroupSelect() {
-	var id = document.getElementById("qa-st-subgroup").selectedItem.value;
-	updateCaller(sTestrun.name, sTestgroup.name, id, 0);
+  var id = document.getElementById("qa-st-subgroup").selectedItem.value;
+  updateCaller(sTestrun.name, sTestgroup.name, id, 0);
 }
 
 function populateTestRuns(testrunsWrapper) {
-	var menu = document.getElementById("qa-st-testrun");
-	testrunsWrapper = qaTools.arrayify(testrunsWrapper);
-	sTestrunsWrapper = testrunsWrapper;
+  var menu = document.getElementById("qa-st-testrun");
+  testrunsWrapper = qaTools.arrayify(testrunsWrapper);
+  sTestrunsWrapper = testrunsWrapper;
+
+  while (menu.firstChild) {  // clear menu
+    menu.removeChild(menu.firstChild);
+  }
 
-	while (menu.firstChild) {  // clear menu
-		menu.removeChild(menu.firstChild);
-	}
-
-	for (var i = 0; i < testrunsWrapper.length; i++) {
-		if (testrunsWrapper[i].enabled == 0) continue;
-		var item = menu.appendItem(testrunsWrapper[i].name, testrunsWrapper[i].test_run_id);
-	}
-	menu.selectedIndex = 0;
-	handleRunSelect();
+  for (var i = 0; i < testrunsWrapper.length; i++) {
+    if (testrunsWrapper[i].enabled == 0) continue;
+    var item = menu.appendItem(testrunsWrapper[i].name,
+                              testrunsWrapper[i].test_run_id);
+  }
+  menu.selectedIndex = 0;
+  handleRunSelect();
 }
 
 function populateTestGroups(testrun) {
-	sTestrun = testrun;
-	var menu = document.getElementById("qa-st-testgroup");
-	while (menu.firstChild) {  // clear menu
-		menu.removeChild(menu.firstChild);
-	}
+  sTestrun = testrun;
+  var menu = document.getElementById("qa-st-testgroup");
+  while (menu.firstChild) {  // clear menu
+    menu.removeChild(menu.firstChild);
+  }
 
-	var testgroups = qaTools.arrayify(testrun.testgroups);
-	for (var i = 0; i < testgroups.length; i++) {
-		if (testgroups[i].enabled == 0) continue;
-		menu.appendItem(testgroups[i].name, testgroups[i].testgroup_id);
-	}
-	menu.selectedIndex = 0;
+  var testgroups = qaTools.arrayify(testrun.testgroups);
+  for (var i = 0; i < testgroups.length; i++) {
+    if (testgroups[i].enabled == 0) continue;
+    menu.appendItem(testgroups[i].name, testgroups[i].testgroup_id);
+  }
+  menu.selectedIndex = 0;
 }
 
 function populateSubgroups(testgroup) {
-	sTestgroup = testgroup;
-	var menu = document.getElementById("qa-st-subgroup");
-	while (menu.firstChild) {  // clear menu
-		menu.removeChild(menu.firstChild);
-	}
-	var subgroups = qaTools.arrayify(testgroup.subgroups);
+  sTestgroup = testgroup;
+  var menu = document.getElementById("qa-st-subgroup");
+  while (menu.firstChild) {  // clear menu
+    menu.removeChild(menu.firstChild);
+  }
+  var subgroups = qaTools.arrayify(testgroup.subgroups);
 
-	for (var i = 0; i < subgroups.length; i++) {
-		if (subgroups[i].enabled == 0) continue;
-		menu.appendItem(subgroups[i].name, subgroups[i].subgroup_id);
-	}
-	menu.selectedIndex = 0;
+  for (var i = 0; i < subgroups.length; i++) {
+    if (subgroups[i].enabled == 0) continue;
+    menu.appendItem(subgroups[i].name, subgroups[i].subgroup_id);
+  }
+  menu.selectedIndex = 0;
 }
 
 function OK() {
-	handleOK();
-	return true;
+  handleOK();
+  return true;
 }
 
 function updateCaller(testrunSummary, testgroupSummary, subgroupID, index) {
-	litmus.writeStateToPref(testrunSummary, testgroupSummary, subgroupID, index);
-	updateFunction();
+  litmus.writeStateToPref(testrunSummary, testgroupSummary, subgroupID, index);
+  updateFunction();
 }
 
 function Cancel() {
-	handleCancel();
-	return true;
+  handleCancel();
+  return true;
 }
--- a/testing/extensions/community/chrome/content/tabs/selecttests.xul
+++ b/testing/extensions/community/chrome/content/tabs/selecttests.xul
@@ -1,89 +1,89 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Ben Hsieh <bhsieh@mozilla.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
-
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Ben Hsieh <ben.hsieh@gmail.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 <!DOCTYPE dialog PUBLIC "-//MOZILLA//DTD XUL V1.0//EN" "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 [<!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
 <?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
 <?xml-stylesheet href="chrome://qa/skin/" type="text/css"?>
 
 <dialog id="dialog-name"
-		xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-		persist="screenX screenY width height"
-		buttons="accept,cancel"
-		ondialogaccept="return OK();"
-		ondialogcancel="return Cancel();"
-		onload="handleLoad();">
+  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+  persist="screenX screenY width height"
+  buttons="accept,cancel"
+  ondialogaccept="return OK();"
+  ondialogcancel="return Cancel();"
+  onload="handleLoad();">
+
+  <script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/qa.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/settings.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/common.js" />
+  <script type="application/x-javascript" src="chrome://qa/content/tabs/selecttests.js" />
 
-	<script type="application/x-javascript" src="chrome://qa/content/MochiKit/MochiKit.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/prefs.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/litmus.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/qa.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/settings.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/common.js" />
-	<script type="application/x-javascript" src="chrome://qa/content/tabs/selecttests.js" />
-	
-	<dialogheader description="&qa.selecttests.header;" />
-	<spacer height="20" />
-	<vbox>
-		<hbox>
-		<description value="Test Run:" />
-		<menulist label="  " id="qa-st-testrun" onselect="handleRunSelect()">
-			<menupopup >
-				<menuitem label="&qa.selecttests.load;" selected="true" />
-			</menupopup>
-		</menulist>
-		</hbox>
-		<spacer height="20" />
-		<hbox>
-			<vbox>
-				<description value="Test Group:" />
-				<listbox id="qa-st-testgroup" rows = "5" onselect="handleTestgroupSelect()">
-					<listitem label="&qa.selecttests.load;" />
-				</listbox>
-			</vbox>
-			<vbox>
-				<description value="Subgroup" />
-				<listbox id="qa-st-subgroup" rows = "5" onselect="handleSubgroupSelect()">
-					<listitem label="&qa.selecttests.load;" />
-				</listbox>
-			</vbox>
-		</hbox>
-	</vbox>
+  <dialogheader description="&qa.selecttests.header;" />
+  <spacer height="20" />
+  <vbox>
+    <hbox>
+    <description value="Test Run:" />
+    <menulist label="  " id="qa-st-testrun" onselect="handleRunSelect()">
+      <menupopup >
+        <menuitem label="&qa.selecttests.load;" selected="true" />
+      </menupopup>
+    </menulist>
+    </hbox>
+    <spacer height="20" />
+    <hbox>
+      <vbox>
+        <description value="Test Group:" />
+        <listbox id="qa-st-testgroup" rows = "5"
+                onselect="handleTestgroupSelect()">
+          <listitem label="&qa.selecttests.load;" />
+        </listbox>
+      </vbox>
+      <vbox>
+        <description value="Subgroup" />
+        <listbox id="qa-st-subgroup" rows = "5"
+                 onselect="handleSubgroupSelect()">
+          <listitem label="&qa.selecttests.load;" />
+        </listbox>
+      </vbox>
+    </hbox>
+  </vbox>
 </dialog>
-
--- a/testing/extensions/community/chrome/content/tabs/settings.xul
+++ b/testing/extensions/community/chrome/content/tabs/settings.xul
@@ -1,87 +1,90 @@
-<?xml version="1.0"?><!-- -*- Mode: HTML -*- 
-# ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2006
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#  Zach Lipton <zach@zachlipton.com>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** -->
+<?xml version="1.0"?><!-- -*- Mode: HTML -*-
+* ***** BEGIN LICENSE BLOCK *****
+* Version: MPL 1.1/GPL 2.0/LGPL 2.1
+*
+* The contents of this file are subject to the Mozilla Public License Version
+* 1.1 (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+* http://www.mozilla.org/MPL/
+*
+* Software distributed under the License is distributed on an "AS IS" basis,
+* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+* for the specific language governing rights and limitations under the
+* License.
+*
+* The Original Code is the Mozilla Community QA Extension
+*
+* The Initial Developer of the Original Code is the Mozilla Corporation.
+* Portions created by the Initial Developer are Copyright (C) 2007
+* the Initial Developer. All Rights Reserved.
+*
+* Contributor(s):
+*  Zach Lipton <zach@zachlipton.com>
+*
+* Alternatively, the contents of this file may be used under the terms of
+* either the GNU General Public License Version 2 or later (the "GPL"), or
+* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+* in which case the provisions of the GPL or the LGPL are applicable instead
+* of those above. If you wish to allow use of your version of this file only
+* under the terms of either the GPL or the LGPL, and not to allow others to
+* use your version of this file under the terms of the MPL, indicate your
+* decision by deleting the provisions above and replace them with the notice
+* and other provisions required by the GPL or the LGPL. If you do not delete
+* the provisions above, a recipient may use your version of this file under
+* the terms of any one of the MPL, the GPL or the LGPL.
+*
+* ***** END LICENSE BLOCK ***** -->
 
 <!DOCTYPE overlay [
 <!ENTITY % qaDTD SYSTEM "chrome://qa/locale/qa.dtd"> %qaDTD;
 ]>
 
-<overlay id="qa-settings-overlay" 
+<overlay id="qa-settings-overlay"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
 <script type="application/x-javascript" src="chrome://qa/content/settings.js" />
-<script type="application/x-javascript">
 
-    // on load, set an event listener to deal with saving settings when 
-    // changing tabs
-    window.addEventListener('load', function() {
-        $('qa_tabrow').addEventListener('select', qaPrefsWindow.onSwitchTab, false);
-    }, false);
-</script>
 <stringbundleset id="stringbundleset">
   <stringbundle id="bundle_qa" src="chrome://qa/locale/qa.properties" />
 </stringbundleset>
 
 <tabpanel id="qa-tab-settings">
 <vbox flex="1">
   <groupbox>
     <caption label="&qa.preferences.litmus.title;" />
-      <label control="qa-preferences-litmus-username" value="&qa.preferences.litmus.username;"/>
+      <label control="qa-preferences-litmus-username"
+             value="&qa.preferences.litmus.username;"/>
       <textbox id="qa-preferences-litmus-username" />
-      <label control="qa-preferences-litmus-password" value="&qa.preferences.litmus.password;"/>
+      <label control="qa-preferences-litmus-password"
+             value="&qa.preferences.litmus.password;"/>
       <textbox id="qa-preferences-litmus-password" type="password" />
       <hbox>
-      <button id="qa-preferences-litmus-createAccount" label="&qa.preferences.litmus.createAccount;"
-      	oncommand="qaPrefsWindow.createAccount();" />
+      <button id="qa-preferences-litmus-createAccount"
+              label="&qa.preferences.litmus.createAccount;"
+              oncommand="qaPrefsWindow.createAccount();" />
       </hbox>
   </groupbox>
-  
+
   <groupbox id="qa-prefs-notify">
     <caption label="&qa.preferences.notification.title;" />
-    <checkbox id="qa-prefs-notify-disableall" label="&qa.preferences.notification.disableall;" />
+    <checkbox id="qa-prefs-notify-disableall"
+              label="&qa.preferences.notification.disableall;" />
     <description>&qa.preferences.notification.header;</description>
-    <checkbox id="qa-prefs-notify-testday" label="&qa.preferences.notification.testday;" />
-    <checkbox id="qa-prefs-notify-bugday" label="&qa.preferences.notification.bugday;" />
-    <checkbox id="qa-prefs-notify-prerelease" label="&qa.preferences.notification.prerelease;" />
-    <checkbox id="qa-prefs-notify-qmo" label="&qa.preferences.notification.qmo;" />
-    <checkbox id="qa-prefs-notify-newbuild" label="&qa.preferences.notification.newbuild;" />
-    <checkbox id="qa-prefs-notify-other" label="&qa.preferences.notification.other;" />
+    <checkbox id="qa-prefs-notify-testday"
+              label="&qa.preferences.notification.testday;" />
+    <checkbox id="qa-prefs-notify-bugday"
+              label="&qa.preferences.notification.bugday;" />
+    <checkbox id="qa-prefs-notify-prerelease"
+              label="&qa.preferences.notification.prerelease;" />
+    <checkbox id="qa-prefs-notify-qmo"
+              label="&qa.preferences.notification.qmo;" />
+    <checkbox id="qa-prefs-notify-newbuild"
+              label="&qa.preferences.notification.newbuild;" />
+    <checkbox id="qa-prefs-notify-other"
+              label="&qa.preferences.notification.other;" />
   </groupbox>
 </vbox>
 
 </tabpanel>
 
-</overlay>
\ No newline at end of file
+</overlay>
--- a/testing/extensions/community/chrome/locale/en-US/qa.dtd
+++ b/testing/extensions/community/chrome/locale/en-US/qa.dtd
@@ -1,23 +1,60 @@
+<!-- ***** BEGIN LICENSE BLOCK *****
+   - Version: MPL 1.1/GPL 2.0/LGPL 2.1
+   -
+   - The contents of this file are subject to the Mozilla Public License Version
+   - 1.1 (the "License"); you may not use this file except in compliance with
+   - the License. You may obtain a copy of the License at
+   - http://www.mozilla.org/MPL/
+   -
+   - Software distributed under the License is distributed on an "AS IS" basis,
+   - WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+   - for the specific language governing rights and limitations under the
+   - License.
+   -
+   - The Original Code is Mozilla QA Extension Code.
+   -
+   - The Initial Developer of the Original Code is the Mozilla Corporation.
+   - Portions created by the Initial Developer are Copyright (C) 2007
+   - the Initial Developer. All Rights Reserved.
+   -
+   - Contributor(s):
+   -  Zach Lipton <zach@zachlipton.com>
+   -  Ben Hsieh <bhsieh@mozilla.com>
+   -
+   - Alternatively, the contents of this file may be used under the terms of
+   - either the GNU General Public License Version 2 or later (the "GPL"), or
+   - the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+   - in which case the provisions of the GPL or the LGPL are applicable instead
+   - of those above. If you wish to allow use of your version of this file only
+   - under the terms of either the GPL or the LGPL, and not to allow others to
+   - use your version of this file under the terms of the MPL, indicate your
+   - decision by deleting the provisions above and replace them with the notice
+   - and other provisions required by the LGPL or the GPL. If you do not delete
+   - the provisions above, a recipient may use your version of this file under
+   - the terms of any one of the MPL, the GPL or the LGPL.
+   -
+   - ***** END LICENSE BLOCK ***** -->
+
 <!ENTITY qa.litmus.title "Litmus">
 <!ENTITY qa.litmus.selecttests "Select Tests">
 <!ENTITY qa.litmus.testlist.initiallabel "No tests loaded, select some tests!">
 <!ENTITY qa.litmus.testlist.initialdescription "No testcase">
-<!ENTITY qa.statusbar.label	"QA">
-<!ENTITY qa.mainwindow.prefs	"Preferences">
-<!ENTITY qa.mainwindow.title	"Mozilla QA">
-<!ENTITY qa.testcase.steps	"Steps to Perform">
-<!ENTITY qa.testcase.expected	"Expected Results">
-<!ENTITY qa.testcase.result.pass	"Test Passed">
-<!ENTITY qa.testcase.result.fail	"Test Failed">
-<!ENTITY qa.testcase.result.unclearbroken	"Test is unclear or broken">
-<!ENTITY qa.testcase.comment	"Comment (optional):">
+<!ENTITY qa.statusbar.label "QA">
+<!ENTITY qa.mainwindow.prefs  "Preferences">
+<!ENTITY qa.mainwindow.title  "Mozilla QA">
+<!ENTITY qa.testcase.steps  "Steps to Perform">
+<!ENTITY qa.testcase.expected  "Expected Results">
+<!ENTITY qa.testcase.result.pass  "Test Passed">
+<!ENTITY qa.testcase.result.fail  "Test Failed">
+<!ENTITY qa.testcase.result.unclearbroken  "Test is unclear or broken">
+<!ENTITY qa.testcase.comment  "Comment (optional):">
 
-<!ENTITY qa.selecttests.load	"Loading...">
+<!ENTITY qa.selecttests.load  "Loading...">
 <!ENTITY qa.selecttests.header "Select test group">
 
 <!ENTITY qa.preferences.title "Settings">
 <!ENTITY qa.preferences.litmus.title "Litmus Settings">
 <!ENTITY qa.preferences.litmus.username "Email:">
 <!ENTITY qa.preferences.litmus.password "Password:">
 <!ENTITY qa.preferences.litmus.OK "Save">
 <!ENTITY qa.preferences.litmus.createAccount "Create New Account">
@@ -39,99 +76,99 @@
 <!ENTITY qa.qmo.forumposts "Recent forum topics">
 <!ENTITY qa.qmo.thelatest "The latest from QMO">
 
 
 <!ENTITY qa.setup.title	"Mozilla QA Extension: Setup">
 <!ENTITY qa.setup.welcomeheader	"Welcome to the Mozilla QA Extension!">
 <!ENTITY qa.setup.welcometext	"
 <html:h4>Welcome to the Mozilla Quality Assurance community!</html:h4>
-Mozilla Quality Assurance (QA) is a network of countless volunteers 
-from the Internet community, along with a group of Mozilla employees, who share 
-the common mission of <html:i>taming the lizard</html:i> through testing and 
+Mozilla Quality Assurance (QA) is a network of countless volunteers
+from the Internet community, along with a group of Mozilla employees, who share
+the common mission of <html:i>taming the lizard</html:i> through testing and
 constructively reporting bugs in Mozilla products.
 <html:br/><html:br/>
-This extension allows you to <html:b>find bugs</html:b> in Mozilla products by 
-running simple tests within the browser. Helping out doesn't take up much of 
-your time, doesn't require any special skills, and helps to improve Mozilla 
-products like Firefox and Thunderbird. 
+This extension allows you to <html:b>find bugs</html:b> in Mozilla products by
+running simple tests within the browser. Helping out doesn't take up much of
+your time, doesn't require any special skills, and helps to improve Mozilla
+products like Firefox and Thunderbird.
 <html:br/><html:br/>
-When you find a bug, this extension helps you to <html:b>report it</html:b> 
-to <html:a href='http://litmus.mozilla.org/' target='_blank'>Litmus</html:a>, 
-the tool we use to track our testing efforts. Your test results are valuable, 
-and we use them to ensure that all features work properly across a wide range 
-of platforms, operating systems, and configurations. 
+When you find a bug, this extension helps you to <html:b>report it</html:b>
+to <html:a href='http://litmus.mozilla.org/' target='_blank'>Litmus</html:a>,
+the tool we use to track our testing efforts. Your test results are valuable,
+and we use them to ensure that all features work properly across a wide range
+of platforms, operating systems, and configurations.
 
 <html:h4>Why Should I Get Involved?</html:h4>
 xxx
 
 <html:h5>For more information on Mozilla Quality Assurance, please
-see the 
+see the
 <html:a href='http://wiki.mozilla.org/Mozilla_QA_Community' target='_blank'>
 Mozilla QA Community Wiki</html:a>.</html:h5>
 ">
 
 <!ENTITY qa.setup.aboutheader	"About the Mozilla QA Extension">
 <!ENTITY qa.setup.abouttext	"
 <html:h4>How do I get started?</html:h4>
-Getting started with Mozilla QA is easy! This setup wizard will ask you a 
-few simple questions. Once that's done, you will be taken to the test runner, 
-where you can select what you want to test, run those tests, and submit your 
-results to Litmus. You'll also have a chance to learn about QA Community 
+Getting started with Mozilla QA is easy! This setup wizard will ask you a
+few simple questions. Once that's done, you will be taken to the test runner,
+where you can select what you want to test, run those tests, and submit your
+results to Litmus. You'll also have a chance to learn about QA Community
 events and other ways to get involved.
 
 <html:h4>A note on privacy</html:h4>
-When you use the QA Extension, you are submitting test results to an 
+When you use the QA Extension, you are submitting test results to an
 open system. Other members of the community will access the information you
-submit in order to improve the quality of Mozilla products. You 
-<html:b>should not</html:b> submit any private or confidential information 
+submit in order to improve the quality of Mozilla products. You
+<html:b>should not</html:b> submit any private or confidential information
 using the Mozilla QA Extension. If you provide your real name or an IRC nickname
-to display instead, we will hide your email address from 
-public view to help prevent email harvesting bots from spamming you. 
-For more information, please see our 
+to display instead, we will hide your email address from
+public view to help prevent email harvesting bots from spamming you.
+For more information, please see our
 <html:a href='http://www.mozilla.com/privacy-policy.html' target='_blank'>
 privacy policy</html:a>.
 
 <html:h4>Welcome to the Mozilla QA Community. Let's get started!</html:h4>
 ">
 
 <!ENTITY qa.setup.accountheader	"Creating an account">
-<!ENTITY qa.setup.accounttext	"To use the QA Extension, you will need an account 
+<!ENTITY qa.setup.accounttext	"To use the QA Extension, you will need an account
 on Litmus, our test management system.">
 <!ENTITY qa.setup.haveaccount	"Do you already have a Litmus account?">
 <!ENTITY qa.setup.accountno	"I do not have a Litmus account">
 <!ENTITY qa.setup.accountyes	"I already have a Litmus account">
 <!ENTITY qa.setup.accountyes.enterinfo	"Enter your Litmus account information:">
-<!ENTITY qa.setup.accountno.text	"Complete the form below and press the 
-<html:b>Create Account</html:b> button to create your new account. <html:br/>Once your 
+<!ENTITY qa.setup.accountno.text	"Complete the form below and press the
+<html:b>Create Account</html:b> button to create your new account. <html:br/>Once your
 account is created, press the 'Continue' button to complete setup.">
 
 <!ENTITY qa.setup.accountdone	"
 <html:h4>Account Created</html:h4>
-<html:b>Congratulations!</html:b> Your Litmus 
-account has been created. You'll be able to use your new account both here in 
+<html:b>Congratulations!</html:b> Your Litmus
+account has been created. You'll be able to use your new account both here in
 the QA Extension, and on the Litmus website.
 
 <html:h4>That's it!</html:h4>
-<html:b>You're ready to start testing.</html:b> If you have any questions along 
-the way, you may post to the 
+<html:b>You're ready to start testing.</html:b> If you have any questions along
+the way, you may post to the
 <html:a href='http://weblogs.mozillazine.org/qa/' target='_blank'>Mozilla QA Blog
-</html:a>, or, if you prefer, you can join us on 
-<html:a href='http://irc.mozilla.org' target='_blank'>IRC</html:a> (Internet Relay 
-Chat) and become more involved in our testing community. 
-We are in #qa on irc.mozilla.org. If you have an irc client installed already, 
+</html:a>, or, if you prefer, you can join us on
+<html:a href='http://irc.mozilla.org' target='_blank'>IRC</html:a> (Internet Relay
+Chat) and become more involved in our testing community.
+We are in #qa on irc.mozilla.org. If you have an irc client installed already,
 you should be able to join by clicking this link: <html:a href='irc://irc.mozilla.org/qa'>
 join #qa</html:a>.
 ">
 
 <!ENTITY qa.setup.sysconfig.header	"System Configuration">
 <!ENTITY qa.setup.sysconfig.text	"
-For your test results to be useful, we need to know a little bit about your 
-system configuration. We've tried to detect as much of the information below as 
-possible, but please check the settings below and make any necessary changes. 
+For your test results to be useful, we need to know a little bit about your
+system configuration. We've tried to detect as much of the information below as
+possible, but please check the settings below and make any necessary changes.
 ">
 <!ENTITY qa.setup.sysconfig.platform	"Platform:">
 <!ENTITY qa.setup.sysconfig.opsys	"Operating System:">
 
 <!ENTITY qa.bugzilla.title "Bugzilla">
 
 <!ENTITY qa.chat.title "Chat">
 <!ENTITY qa.chat.introtitle "What is IRC?">
--- a/testing/extensions/community/chrome/locale/en-US/qa.properties
+++ b/testing/extensions/community/chrome/locale/en-US/qa.properties
@@ -1,9 +1,45 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla QA Extension Code.
+#
+# The Initial Developer of the Original Code is the Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2007
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Zach Lipton <zach@zachlipton.com>
+#  Ben Hsieh <bhsieh@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
 qa.extension.testcase.head = Testcase #
 qa.extension.prefs.loginError = Login Error. Please check your username and password or create a new account.
 qa.extension.prefs.loadingMsg = Validating account information. Please Wait...
 qa.extension.prefs.savedMsg = Your settings have been saved
 qa.extension.sysconfig.loadingMsg = Loading menu options...
 qa.extension.loading = Loading...
-
 qa.extension.litmus.progress = Test %1$S of %2$S
 qa.extension.litmus.stats = My tests run - week: %1$S, month: %2$S, all time: %3$S
\ No newline at end of file
--- a/testing/extensions/community/chrome/locale/en-US/urls.properties
+++ b/testing/extensions/community/chrome/locale/en-US/urls.properties
@@ -1,5 +1,42 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla QA Extension Code.
+#
+# The Initial Developer of the Original Code is the Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2007
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Zach Lipton <zach@zachlipton.com>
+#  Ben Hsieh <bhsieh@mozilla.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
 qa.extension.url.qmo.upcomingEvents = http://quality.mozilla.org/event/2007/06/21/feed/all/all/
 qa.extension.url.qmo.news = http://quality.mozilla.org/rss.xml
 qa.extension.url.qmo.forum_topics = http://quality.mozilla.org/extension/forum_topics
 qa.extension.url.qmo.howhelp = http://quality.mozilla.org/extension/howtohelp_feed
 qa.extension.url.bz.content = http://quality.mozilla.org/extension/bugzillatab_feed
\ No newline at end of file
--- a/testing/extensions/community/chrome/skin/browserOverlays.css
+++ b/testing/extensions/community/chrome/skin/browserOverlays.css
@@ -1,8 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Zach Lipton <zach@zachlipton.com>
+ *  Ben Hsieh <ben.hsieh@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
  #qa-notify {
   right: 18px;
   bottom: 21px;
   position: fixed;
   border: 1px solid grey;
   background-color: white;
   background-image: url("chrome://qa/skin/logolight.png");
   background-repeat: no-repeat;
@@ -17,9 +53,13 @@
 #qa-notify-box {
   padding: 0px 6px 6px 6px;
 	display: table;
 }
 
 #qa-notify-header {
   font-size: 1.5em;
   font-weight: bold;
-}
\ No newline at end of file
+}
+
+#qa-statusbar-overlay {
+  list-style-image: url('chrome://qa/skin/qmo-16px.png');
+}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7c8b3129299436d44b2fd1996051f3d69049bf1c
GIT binary patch
literal 3112
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
CKg5mz
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..99d5f01579025d8a15137056915695cfd6b33c18
GIT binary patch
literal 3104
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..72758200d976d5a547ad64a62a486cb3abb7669d
GIT binary patch
literal 2859
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
JPDHLkV1nh{NW1_5
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ab1d72ad8feb9ea96d56dc242597e038b7427da7
GIT binary patch
literal 3143
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b7a51ab1d99a6432d765596bd52066f9639b99a5
GIT binary patch
literal 2864
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
O0000<MNUMnLSTZ}!bko9
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..91c48214480ba4d85cea7820e8705ab3f113d5a1
GIT binary patch
literal 3169
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
Hu0mjf<)z>^
--- a/testing/extensions/community/chrome/skin/qa.css
+++ b/testing/extensions/community/chrome/skin/qa.css
@@ -1,207 +1,237 @@
-/* ***** BEGIN LICENSE BLOCK *****
-# Version: MPL 1.1/GPL 2.0/LGPL 2.1
-#
-# The contents of this file are subject to the Mozilla Public License Version
-# 1.1 (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# The Original Code is the Mozilla Community QA Extension
-#
-# The Initial Developer of the Original Code is the Mozilla Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2007
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#   Zach Lipton <zach@zachlipton.com>
-#   Zach Linder <zakness@gmail.com>
-#   Ben Hsieh <bhsieh@stanford.edu>
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 2 or later (the "GPL"), or
-# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
-# in which case the provisions of the GPL or the LGPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL or the LGPL, and not to allow others to
-# use your version of this file under the terms of the MPL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the LGPL or the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the MPL, the GPL or the LGPL.
-#
-# ***** END LICENSE BLOCK ***** --> */
-
-@import url(chrome://global/skin/);
-
-@import url(chrome://browser/skin/);
-
-@namespace html "http://www.w3.org/1999/xhtml";
-
-#qa-pass {
-  background: #99ff99;
-  display: none;
-}
-
-/*-------------------------------
-               HTML
-  -------------------------------*/
-
-#qa_tabbox html|ul, #qa_tabbox html|ol {
-  margin: 0;
-  padding: 0;
-}
-#qa_tabbox html|ul li {
-  list-style-type: square;
-  margin-bottom: 0.4em;
-}
-
-#qa_tabbox html|a,
-#qa_tabbox html|a:link,
-#qa_tabbox html|a:visited {
-  font-weight: bold;
-  color: #0067ac;
-}
-#qa_tabbox html|a:focus,
-#qa_tabbox html|a:hover,
-#qa_tabbox html|a:active {
-  color: #333;
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Zach Lipton <zach@zachlipton.com>
+ *  Zach Linder <zakness@gmail.com>
+ *  Ben Hsieh <ben.hsieh@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+@import url(chrome://global/skin/);
+
+@import url(chrome://browser/skin/);
+
+@namespace html "http://www.w3.org/1999/xhtml";
+
+#qa-pass {
+  background: #99ff99;
+  display: none;
 }
 
+/*-------------------------------
+               HTML
+  -------------------------------*/
+
+#qa_tabbox html|ul, #qa_tabbox html|ol {
+  margin: 0;
+  padding: 0;
+}
+#qa_tabbox html|ul li {
+  list-style-type: square;
+  margin-bottom: 0.4em;
+}
+
+#qa_tabbox html|a,
+#qa_tabbox html|a:link,
+#qa_tabbox html|a:visited {
+  font-weight: bold;
+  color: #0067ac;
+}
+#qa_tabbox html|a:focus,
+#qa_tabbox html|a:hover,
+#qa_tabbox html|a:active {
+  color: #333;
+}
 /*remove bullets for everything but lists contained inside testcase data */
 html|li {
   list-style-type: none !important;
 }
 #qa-tab-litmus html|ul html|li {
 	list-style-type: disc !important;
 }
 #qa-tab-litmus html|ol html|li {
 	list-style-type: decimal !important;
 }
 
 #qa-tab-litmus html|ul, #qa-tab-litmus html|ol {
 	padding-left: 20px;
-}
-
-
-/*-------------------------------
-               TABS
-  -------------------------------*/
-#qa_tabbox #qa_tabrow {
-  height: 30px !important;
-  padding-top: 5px !important;
-}
-#qa_tabbox .tab-icon-image {
-  list-style-image: none;
-  width: 0;
-}
-#qa_tabbox #qa-tabbar-qmo {
-  list-style-image: url(qmo-16px.png);
-  width: 15px;
-}
-#qa_tabbox tab, #qa_tabbox tabs spacer {
-  border-bottom: 1px solid #ACA899 !important;
-}
-.tabs-left, .tabs-right {
-  -moz-border-bottom-colors: #ACA899 #ACA899 !important;
-}
-#qa_tabbox tab[selected="true"] {
-  border-bottom: 1px solid #E8E5D8 !important;
-}
-#qa_tabbox #qa-tabbar-spacer {
-  width: 93px;
-}
-
-tabs {
-  border-bottom: 3px solid #E8E5D8;
-}
+}
+
+
+
+/*-------------------------------
+               TABS
+  -------------------------------*/
+#qa_tabbox #qa_tabrow {
+  height: 30px !important;
+  padding-top: 5px !important;
+}
+
+#qa_tabbox .tab-icon-image {
+  list-style-image: none;
+  width: 0;
+}
+
+#qa_tabbox #qa-tabbar-qmo {
+  list-style-image: url(qmo-16px.png);
+  width: 15px;
+}
+
+#qa_tabbox #qa-tabbar-spacer {
+  width: 93px;
+}
+
+
+#qa_tabbox tab, #qa_tabbox tabs spacer {
+  border-bottom: 1px solid #ACA899 !important;
+}
+
+.tabs-left, .tabs-right {
+  -moz-border-bottom-colors: #ACA899 !important;
+}
+
+#qa_tabbox tab[selected="true"] {
+  border-bottom: 1px solid #E8E5D8 !important;
+}
+
+tabs {
+  border-bottom: 1px solid #E8E5D8;
+}
+
+.tab-close-button {
+    display: none !important;
+}
+
+.tabbrowser-tab.highlight > .tab-image-right {
+	background: url("chrome://qa/skin/highlight-start.png") no-repeat !important;
+}
+.tabbrowser-tab.highlight > .tab-image-left {
+	background: url("chrome://qa/skin/highlight-end.png") no-repeat !important;
+}
+.tabbrowser-tab.highlight > .tab-image-middle {
+	background: url("chrome://qa/skin/highlight-mid.png") repeat-x !important;
+}
+
+.tabbrowser-tab.highlight:hover > .tab-image-right {
+	background: url("chrome://qa/skin/highlight-hover-start.png") no-repeat !important;
+}
+.tabbrowser-tab.highlight:hover > .tab-image-left {
+	background: url("chrome://qa/skin/highlight-hover-end.png") no-repeat !important;
+}
+.tabbrowser-tab.highlight:hover > .tab-image-middle {
+	background: url("chrome://qa/skin/highlight-hover-mid.png") repeat-x !important;
+}
 
 /* don't show outline around the middle of selected tabs */
 tab:focus > .tab-middle {
-  outline: 1px none invert !important; 
+  outline: 1px none invert !important;
+}
+
+/*-------------------------------
+               PANELS
+  -------------------------------*/
+#qa_tabbox tabpanel {
+  line-height: 1.6;
+  background-color: white;
+}
+
+#qa_tabbox tabpanels {
+  background-color: white;
+  border-top: 1px solid #ACA899;
+  margin-top: 0px;
+}
+
+#qa_tabbox groupbox {
+  background-color: white;
+}
+#qa_tabbox caption {
+  font: bold 12px helvetica, arial, sans-serif;
+  color: #ec891d;
+  background-color: white;
+  padding: 0;
+}
+
+#qa-qmo-help,
+#qa-qmo-events,
+.box-mheight {
+  max-height: 130px;
+  height: 130px;
+}
+#qa-qmo-forumposts {
+  width: 290px;
 }
-
-/*-------------------------------
-               PANELS
-  -------------------------------*/
-#qa_tabbox tabpanel {
-  line-height: 1.6;
-  background-color: white;
-}
-
-#qa_tabbox tabpanels {
-  background-color: white;
-  border-top: 1px solid #ACA899;
-  margin-top: 0px;
-}
-
-#qa_tabbox groupbox {
-  background-color: white;
-}
-#qa_tabbox caption {
-  font: bold 12px helvetica, arial, sans-serif;
-  color: #ec891d;
-  background-color: white;
-  padding: 0;
-}
-
-#qa-qmo-help,
-#qa-qmo-events,
-.box-mheight {
-  max-height: 130px;
-  height: 130px;
-}
-#qa-qmo-forumposts {
-  width: 290px;
-}
-#qa-qmo-latestbox {
-  height: 200px;
-  width: 290px;
-  overflow: auto;
-  margin-right: 12px;
-}
-
-
-/*-------------------------------
-               NOTIFY
-  -------------------------------*/
-
-#qa-notify {
-  right: 18px;
-  bottom: 21px;
-  position: fixed;
-  border: 1px solid grey;
-  background-color: white;
-  background-image: url("logolight.png");
-  background-repeat: no-repeat;
-  background-position: center;
-}
-
-.qa-notify {
-  height: 140px;
-  width: 420px;
-}
-
-#qa-notify-box {
-  padding: 0px 6px 6px 6px;
-	display: table;
-}
-
-#qa-notify-header {
-  font-size: 1.5em;
-  font-weight: bold;
-}
-
-
-/*-------------------------------
-               GENERAL
-  -------------------------------*/
-
-.list {
-  padding-left: 10px;
+#qa-qmo-latestbox {
+  height: 200px;
+  width: 290px;
+  overflow: auto;
+  margin-right: 12px;
+}
+
+
+/*-------------------------------
+               NOTIFY
+  -------------------------------*/
+
+#qa-notify {
+  right: 18px;
+  bottom: 21px;
+  position: fixed;
+  border: 1px solid grey;
+  background-color: white;
+  background-image: url("logolight.png");
+  background-repeat: no-repeat;
+  background-position: center;
 }
-
+
+.qa-notify {
+  height: 140px;
+  width: 420px;
+}
+
+#qa-notify-box {
+  padding: 0px 6px 6px 6px;
+	display: table;
+}
+
+#qa-notify-header {
+  font-size: 1.5em;
+  font-weight: bold;
+}
+
+
+/*-------------------------------
+               GENERAL
+  -------------------------------*/
+
+.list {
+  padding-left: 10px;
+}
--- a/testing/extensions/community/defaults/preferences/qa.js
+++ b/testing/extensions/community/defaults/preferences/qa.js
@@ -1,8 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2007
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Zach Lipton <zach@zachlipton.com>
+ *  Ben Hsieh <bhsieh@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+* ***** END LICENSE BLOCK ***** */
+
 pref("qa.extension.litmus.url", "http://litmus.mozilla.org/");
 pref("qa.extension.hermes.url", "http://litmus.mozilla.org/hermes/1/");
+pref("qa.extension.bugzilla.url", "http:/bugzilla.mozilla.org/");
 pref("qa.extension.isFirstTime", true);
 pref("qa.extension.minNotificationInterval", 5400000); // 90 minutes
 pref("qa.extension.lastNotificationTime", 0);
 pref("qa.extension.minNotificationCheckInterval", 5400000); // 90 minutes
 pref("qa.extension.lastNotificationCheckTime", 0);
-pref("qa.extension.notificationSettings", '0,1,0,1,0,0,1');
\ No newline at end of file
+pref("qa.extension.notificationSettings", '0,1,0,1,0,0,1');
--- a/testing/extensions/community/install.rdf
+++ b/testing/extensions/community/install.rdf
@@ -1,20 +1,20 @@
-<?xml version="1.0"?>
-<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
-         xmlns:NC="http://home.netscape.com/NC-rdf#"
-         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-  <RDF:Description RDF:about="rdf:#$QJqvE"
-                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
-                   em:minVersion="2.0"
-                   em:maxVersion="3.0a9" />
-  <RDF:Description RDF:about="urn:mozilla:install-manifest"
-                   em:id="{667e9f3d-0096-4d2b-b171-9a96afbabe20}"
-                   em:version="0.1.4"
-                   em:type="2"
-                   em:name="Mozilla Quality Extension"
-                   em:description="The QA tool"
-                   em:creator="Mozilla Quality Assurance"
-                   em:homepageURL="http://quality.mozilla.org/"
-                   em:updateURL="https://landfill.bugzilla.org/mozillaQA/update.rdf">
-    <em:targetApplication RDF:resource="rdf:#$QJqvE"/>
-  </RDF:Description>
-</RDF:RDF>
+<?xml version="1.0"?>
+<RDF:RDF xmlns:em="http://www.mozilla.org/2004/em-rdf#"
+         xmlns:NC="http://home.netscape.com/NC-rdf#"
+         xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+  <RDF:Description RDF:about="rdf:#$QJqvE"
+                   em:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+                   em:minVersion="2.0"
+                   em:maxVersion="3.0a9" />
+  <RDF:Description RDF:about="urn:mozilla:install-manifest"
+                   em:id="{667e9f3d-0096-4d2b-b171-9a96afbabe20}"
+                   em:version="0.1.4"
+                   em:type="2"
+                   em:name="Mozilla Quality Extension"
+                   em:description="The QA tool"
+                   em:creator="Mozilla Quality Assurance"
+                   em:homepageURL="http://quality.mozilla.org/"
+                   em:updateURL="https://landfill.bugzilla.org/mozillaQA/update.rdf">
+    <em:targetApplication RDF:resource="rdf:#$QJqvE"/>
+  </RDF:Description>
+</RDF:RDF>
--- a/testing/extensions/community/jar-chrome.manifest
+++ b/testing/extensions/community/jar-chrome.manifest
@@ -1,10 +1,11 @@
-content	qa	jar:chrome/qa.jar!/content/
-skin	qa	classic/1.0	jar:chrome/qa.jar!/skin/
-locale	qa	en-US	jar:chrome/qa.jar!/locale/en-US/
+content qa  jar:chrome/qa.jar!/content/
+skin  qa  classic/1.0 jar:chrome/qa.jar!/skin/
+locale  qa  en-US jar:chrome/qa.jar!/locale/en-US/
 
 overlay chrome://browser/content/browser.xul chrome://qa/content/browserOverlays.xul
 
 content chatzilla_qa jar:chatzilla.jar!/content/chatzilla/
 skin chatzilla_qa modern/1.0 jar:chatzilla.jar!/skin/modern/chatzilla/
 locale chatzilla_qa en-US jar:chatzilla.jar!/locale/en-US/chatzilla/
-content chatzillaservice_qa components/chatzilla-service.js
\ No newline at end of file
+content chatzillaservice_qa components/chatzilla-service.js
+
--- a/testing/extensions/community/platform/Darwin/chrome/skin/platform.css
+++ b/testing/extensions/community/platform/Darwin/chrome/skin/platform.css
@@ -1,10 +1,77 @@
-#qa-tabbar-spacer {
  width: 17px !important;
}
#qa-tabbar-qmo {
  margin-left:  10px !important;
  margin-right: 17px !important;
}
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Mozilla Community QA Extension
+ *
+ * The Initial Developer of the Original Code is the Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *  Zach Lipton <zach@zachlipton.com>
+ *  Ben Hsieh <ben.hsieh@gmail.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
 
-#qa_tabpanels * {
-	background-color: #ebebeb !important;
+#qa-tabbar-spacer {
+  width: 17px !important;
 }
 
-groupbox * {
-	background: url("chrome://global/skin/10pct_transparent_grey.png") repeat !important;
+#qa_tabbox tabpanel {
+  background-color: transparent !important;
+}
+
+#qa_tabbox tabpanels {
+  background-color: transparent !important;
+}
+
+#qa_tabbox groupbox {
+  background-color: transparent !important;
+}
+#qa_tabbox caption {
+  background-color: transparent !important;
 }
 
+/** causes weird behavior on branch, but needed for trunk **/
+#qa-tabbar-qmo {
+  width:16px;
+  margin-left: 13px;
+  margin-right: 5px;
+}
+
+#qa-testcase-comment {
+  background-color: transparent !important;
+  max-width: 170px;
+}
+
+#qa-preferences-litmus-username {
+  max-width: 350px;
+  width: 350px;
+}
+
+#qa-preferences-litmus-password {
+  max-width: 400px;
+  width: 350px;
+}
--- a/testing/extensions/community/platform/WINNT/chrome/skin/platform.css
+++ b/testing/extensions/community/platform/WINNT/chrome/skin/platform.css
@@ -0,0 +1,5 @@
+/**
+ * This file is intentionally left blank to prevent an error from being thrown
+ * on windows when attempting to overwrite the common CSS.  If we need future
+ * specific windows CSS tweaks, they should go here.
+**/