Merge mozilla-central to mozilla-inbound
authorMatt Brubeck <mbrubeck@mozilla.com>
Sat, 24 Sep 2011 08:13:45 -0700
changeset 78819 2b45524deae5595aff0e9dac2c3d17808b2f02b7
parent 78763 fecae145d88426c393645596c44c5306c1ddaf48 (current diff)
parent 78818 971ed890c27dfda9f4851165388fc2911c151659 (diff)
child 78820 e8ed233379f25842026b930c863be26a52433a28
push id78
push userclegnitto@mozilla.com
push dateFri, 16 Dec 2011 17:32:24 +0000
treeherdermozilla-release@79d24e644fdd [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone9.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound
browser/themes/gnomestripe/browser/browser.css
browser/themes/gnomestripe/browser/reload-stop-go.png
browser/themes/pinstripe/browser/Go-arrow.png
browser/themes/pinstripe/browser/browser.css
browser/themes/pinstripe/browser/places/pageStarred.png
browser/themes/winstripe/browser/Go-arrow-aero.png
browser/themes/winstripe/browser/Go-arrow.png
browser/themes/winstripe/browser/browser.css
js/src/xpconnect/tests/TestXPC.cpp
js/src/xpconnect/tests/components/Makefile.in
js/src/xpconnect/tests/components/xpctest_array.cpp
js/src/xpconnect/tests/components/xpctest_attributes.cpp
js/src/xpconnect/tests/components/xpctest_calljs.cpp
js/src/xpconnect/tests/components/xpctest_child.cpp
js/src/xpconnect/tests/components/xpctest_const.cpp
js/src/xpconnect/tests/components/xpctest_domstring.cpp
js/src/xpconnect/tests/components/xpctest_echo.cpp
js/src/xpconnect/tests/components/xpctest_in.cpp
js/src/xpconnect/tests/components/xpctest_inout.cpp
js/src/xpconnect/tests/components/xpctest_module.cpp
js/src/xpconnect/tests/components/xpctest_multiple.cpp
js/src/xpconnect/tests/components/xpctest_noisy.cpp
js/src/xpconnect/tests/components/xpctest_out.cpp
js/src/xpconnect/tests/components/xpctest_overloaded.cpp
js/src/xpconnect/tests/components/xpctest_private.h
js/src/xpconnect/tests/components/xpctest_string.cpp
js/src/xpconnect/tests/components/xpctest_variant.cpp
mobile/themes/core/honeycomb/images/endcap-active-bg.png
mobile/themes/core/honeycomb/images/endcap-default-bg.png
mobile/themes/core/honeycomb/images/endcap-ev-active-bg.png
mobile/themes/core/honeycomb/images/endcap-ev-default-bg.png
mobile/themes/core/honeycomb/images/endcap-ssl-active-bg.png
mobile/themes/core/honeycomb/images/endcap-ssl-default-bg.png
modules/libreg/Makefile.in
modules/libreg/include/Makefile.in
modules/libreg/include/NSReg.h
modules/libreg/include/VerReg.h
modules/libreg/src/Makefile.in
modules/libreg/src/VerReg.c
modules/libreg/src/nr_bufio.c
modules/libreg/src/nr_bufio.h
modules/libreg/src/objs.mk
modules/libreg/src/reg.c
modules/libreg/src/reg.h
modules/libreg/src/vr_stubs.c
modules/libreg/src/vr_stubs.h
modules/libreg/tests/interp.c
modules/libreg/tests/regtest.c
modules/zlib/standalone/Makefile.in
--- a/browser/components/build/Makefile.in
+++ b/browser/components/build/Makefile.in
@@ -49,23 +49,19 @@ SHARED_LIBRARY_LIBS = \
 	$(NULL)
 
 ifneq (,$(filter windows cocoa gtk2, $(MOZ_WIDGET_TOOLKIT)))
 SHARED_LIBRARY_LIBS += ../shell/src/$(LIB_PREFIX)shellservice_s.$(LIB_SUFFIX)
 endif
 
 EXTRA_DSO_LDOPTS += $(call EXPAND_LIBNAME_PATH,unicharutil_external_s,$(LIBXUL_DIST)/lib)
 
-# migration requires mozreg
 LOCAL_INCLUDES += -I$(srcdir)/../migration/src
 SHARED_LIBRARY_LIBS += ../migration/src/$(LIB_PREFIX)migration_s.$(LIB_SUFFIX)
-EXTRA_DSO_LDOPTS += $(LIBXUL_DIST)/lib/$(LIB_PREFIX)mozreg_s.$(LIB_SUFFIX)
 
-# This has to come after the above chunk, because mozreg_s has dependencies on
-# stuff in MOZ_COMPONENT_LIBS.
 EXTRA_DSO_LDOPTS += \
 	$(LIBXUL_DIST)/lib/$(LIB_PREFIX)xpcomglue_s.$(LIB_SUFFIX) \
 	$(MOZ_COMPONENT_LIBS) \
 	$(NULL)
 
 # Mac: Need to link with CoreFoundation for Mac Migrators (PList reading code)
 # GTK2: Need to link with glib for GNOME shell service
 ifneq (,$(filter cocoa gtk2,$(MOZ_WIDGET_TOOLKIT)))
--- a/browser/components/migration/src/nsProfileMigrator.cpp
+++ b/browser/components/migration/src/nsProfileMigrator.cpp
@@ -51,41 +51,28 @@
 #include "nsIWindowWatcher.h"
 
 #include "nsCOMPtr.h"
 #include "nsBrowserCompsCID.h"
 #include "nsComponentManagerUtils.h"
 #include "nsDirectoryServiceDefs.h"
 #include "nsServiceManagerUtils.h"
 
-#include "NSReg.h"
 #include "nsStringAPI.h"
 #include "nsUnicharUtils.h"
 #ifdef XP_WIN
 #include <windows.h>
 #include "nsIWindowsRegKey.h"
 #include "nsILocalFileWin.h"
 #else
 #include <limits.h>
 #endif
 
 #include "nsAutoPtr.h"
 
-#ifndef MAXPATHLEN
-#ifdef PATH_MAX
-#define MAXPATHLEN PATH_MAX
-#elif defined(_MAX_PATH)
-#define MAXPATHLEN _MAX_PATH
-#elif defined(CCHMAXPATH)
-#define MAXPATHLEN CCHMAXPATH
-#else
-#define MAXPATHLEN 1024
-#endif
-#endif
-
 ///////////////////////////////////////////////////////////////////////////////
 // nsIProfileMigrator
 
 #define MIGRATION_WIZARD_FE_URL "chrome://browser/content/migration/migration.xul"
 #define MIGRATION_WIZARD_FE_FEATURES "chrome,dialog,modal,centerscreen,titlebar"
 
 NS_IMETHODIMP
 nsProfileMigrator::Migrate(nsIProfileStartup* aStartup)
@@ -139,25 +126,16 @@ nsProfileMigrator::Migrate(nsIProfileSta
   return ww->OpenWindow(nsnull, 
                         MIGRATION_WIZARD_FE_URL,
                         "_blank",
                         MIGRATION_WIZARD_FE_FEATURES,
                         params,
                         getter_AddRefs(migrateWizard));
 }
 
-NS_IMETHODIMP
-nsProfileMigrator::Import()
-{
-  if (ImportRegistryProfiles(NS_LITERAL_CSTRING("Firefox")))
-    return NS_OK;
-
-  return NS_ERROR_FAILURE;
-}
-
 ///////////////////////////////////////////////////////////////////////////////
 // nsProfileMigrator
 
 NS_IMPL_ISUPPORTS1(nsProfileMigrator, nsIProfileMigrator)
 
 #ifdef XP_WIN
 
 #define INTERNAL_NAME_IEXPLORE        "iexplore"
@@ -262,115 +240,8 @@ nsProfileMigrator::GetDefaultBrowserMigr
   CHECK_MIGRATOR("safari");
 #endif
   CHECK_MIGRATOR("opera");
 
 #undef CHECK_MIGRATOR
 #endif
   return NS_ERROR_FAILURE;
 }
-
-PRBool
-nsProfileMigrator::ImportRegistryProfiles(const nsACString& aAppName)
-{
-  nsresult rv;
-
-  nsCOMPtr<nsIToolkitProfileService> profileSvc
-    (do_GetService(NS_PROFILESERVICE_CONTRACTID));
-  NS_ENSURE_TRUE(profileSvc, PR_FALSE);
-
-  nsCOMPtr<nsIProperties> dirService
-    (do_GetService("@mozilla.org/file/directory_service;1"));
-  NS_ENSURE_TRUE(dirService, PR_FALSE);
-
-  nsCOMPtr<nsILocalFile> regFile;
-#ifdef XP_WIN
-  rv = dirService->Get(NS_WIN_APPDATA_DIR, NS_GET_IID(nsILocalFile),
-                       getter_AddRefs(regFile));
-  NS_ENSURE_SUCCESS(rv, PR_FALSE);
-  regFile->AppendNative(aAppName);
-  regFile->AppendNative(NS_LITERAL_CSTRING("registry.dat"));
-#elif defined(XP_MACOSX)
-  rv = dirService->Get(NS_MAC_USER_LIB_DIR, NS_GET_IID(nsILocalFile),
-                       getter_AddRefs(regFile));
-  NS_ENSURE_SUCCESS(rv, PR_FALSE);
-  regFile->AppendNative(aAppName);
-  regFile->AppendNative(NS_LITERAL_CSTRING("Application Registry"));
-#elif defined(XP_OS2)
-  rv = dirService->Get(NS_OS2_HOME_DIR, NS_GET_IID(nsILocalFile),
-                       getter_AddRefs(regFile));
-  NS_ENSURE_SUCCESS(rv, PR_FALSE);
-  regFile->AppendNative(aAppName);
-  regFile->AppendNative(NS_LITERAL_CSTRING("registry.dat"));
-#else
-  rv = dirService->Get(NS_UNIX_HOME_DIR, NS_GET_IID(nsILocalFile),
-                       getter_AddRefs(regFile));
-  NS_ENSURE_SUCCESS(rv, PR_FALSE);
-  nsCAutoString dotAppName;
-  ToLowerCase(aAppName, dotAppName);
-  dotAppName.Insert('.', 0);
-  
-  regFile->AppendNative(dotAppName);
-  regFile->AppendNative(NS_LITERAL_CSTRING("appreg"));
-#endif
-
-  nsCAutoString path;
-  rv = regFile->GetNativePath(path);
-  NS_ENSURE_SUCCESS(rv, PR_FALSE);
-
-  if (NR_StartupRegistry())
-    return PR_FALSE;
-
-  PRBool migrated = PR_FALSE;
-  HREG reg = nsnull;
-  RKEY profiles = 0;
-  REGENUM enumstate = 0;
-  char profileName[MAXREGNAMELEN];
-
-  if (NR_RegOpen(path.get(), &reg))
-    goto cleanup;
-
-  if (NR_RegGetKey(reg, ROOTKEY_COMMON, "Profiles", &profiles))
-    goto cleanup;
-
-  while (!NR_RegEnumSubkeys(reg, profiles, &enumstate,
-                            profileName, MAXREGNAMELEN, REGENUM_CHILDREN)) {
-#ifdef DEBUG_bsmedberg
-    printf("Found profile %s.\n", profileName);
-#endif
-
-    RKEY profile = 0;
-    if (NR_RegGetKey(reg, profiles, profileName, &profile)) {
-      NS_ERROR("Could not get the key that was enumerated.");
-      continue;
-    }
-
-    char profilePath[MAXPATHLEN];
-    if (NR_RegGetEntryString(reg, profile, "directory",
-                             profilePath, MAXPATHLEN))
-      continue;
-
-    nsCOMPtr<nsILocalFile> profileFile
-      (do_CreateInstance("@mozilla.org/file/local;1"));
-    if (!profileFile)
-      continue;
-
-#if defined (XP_MACOSX)
-    rv = profileFile->SetPersistentDescriptor(nsDependentCString(profilePath));
-#else
-    NS_ConvertUTF8toUTF16 widePath(profilePath);
-    rv = profileFile->InitWithPath(widePath);
-#endif
-    if (NS_FAILED(rv)) continue;
-
-    nsCOMPtr<nsIToolkitProfile> tprofile;
-    profileSvc->CreateProfile(profileFile, nsnull,
-                              nsDependentCString(profileName),
-                              getter_AddRefs(tprofile));
-    migrated = PR_TRUE;
-  }
-
-cleanup:
-  if (reg)
-    NR_RegClose(reg);
-  NR_ShutdownRegistry();
-  return migrated;
-}
--- a/browser/components/migration/src/nsProfileMigrator.h
+++ b/browser/components/migration/src/nsProfileMigrator.h
@@ -53,18 +53,12 @@ public:
 
   nsProfileMigrator() { }
 
 protected:
   ~nsProfileMigrator() { }
 
   nsresult GetDefaultBrowserMigratorKey(nsACString& key,
                                         nsCOMPtr<nsIBrowserProfileMigrator>& bpm);
-
-  /**
-   * Import profiles from ~/.firefox/
-   * @return PR_TRUE if any profiles imported.
-   */
-  PRBool ImportRegistryProfiles(const nsACString& aAppName);
 };
 
 #endif
 
--- a/browser/themes/gnomestripe/browser/browser.css
+++ b/browser/themes/gnomestripe/browser/browser.css
@@ -951,21 +951,21 @@ toolbar[iconsize="small"] #feed-button {
 
 #urlbar-container {
   -moz-box-orient: horizontal;
   -moz-box-align: stretch;
 }
 
 #urlbar-icons {
   -moz-box-align: center;
-  -moz-padding-end: 2px;
 }
 
 .urlbar-icon {
   cursor: pointer;
+  padding: 0 3px;
 }
 
 #urlbar-search-splitter {
   -moz-appearance: none;
   width: 8px;
   -moz-margin-start: -4px;
 }
 
@@ -1310,93 +1310,47 @@ richlistitem[type~="action"][actiontype=
   color: GrayText;
   font-size: smaller;
 }
 
 .autocomplete-treebody::-moz-tree-cell(suggesthint) {
   border-top: 1px solid GrayText;
 }
 
-/* Go button */
+/* Combined go/reload/stop button in location bar */
 
 #go-button {
-  padding: 3px 2px 2px 2px;
-  list-style-image: url("chrome://browser/skin/Go-arrow.png");
+  padding-top: 2px;
+  padding-bottom: 2px;
 }
 
-#go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
-  -moz-transform: scaleX(-1);
-}
-
-/* Combined go/reload/stop button in location bar */
-
 #urlbar > toolbarbutton {
   -moz-appearance: none;
-  list-style-image: url("chrome://browser/skin/reload-stop-go.png");
-  margin: -1px;
-  -moz-margin-start: 0;
-  padding: 0 3px;
-  background-origin: border-box;
+  padding: 0;
   border: none;
-  -moz-border-start: 1px solid rgba(0,0,0,.35);
-  box-shadow: 0 1px 0 rgba(0,0,0,.1) inset,
-              -1px -1px 1px rgba(255,255,255,.2) inset;
-}
-
-#urlbar:-moz-locale-dir(ltr) > toolbarbutton {
-  border-top-right-radius: 2px;
-  border-bottom-right-radius: 2px;
+  cursor: pointer;
+  width: 22px;
 }
 
-#urlbar:-moz-locale-dir(rtl) > toolbarbutton {
-  border-top-left-radius: 2px;
-  border-bottom-left-radius: 2px;
+#go-button,
+#urlbar-go-button {
+  list-style-image: url("chrome://browser/skin/Go-arrow.png");
 }
 
-#urlbar > toolbarbutton:not([disabled]):active:hover,
-#urlbar-reload-button:not(:hover) {
-  -moz-border-start-style: none;
-  -moz-padding-start: 4px;
-  box-shadow: none;
-}
-
-#urlbar > toolbarbutton:not([disabled]):active:hover {
-  box-shadow: 0 0 6.5px rgba(0,0,0,.4) inset,
-              0 0 2px rgba(0,0,0,.4) inset;
-}
-
-#urlbar-go-button {
-  -moz-image-region: rect(0px, 56px, 14px, 42px);
-  background-image: -moz-linear-gradient(rgb(143,219,69), rgb(115,177,57));
-}
-
+#go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon,
 #urlbar-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
   -moz-transform: scaleX(-1);
 }
 
-#urlbar-go-button:hover {
-  background-image: -moz-linear-gradient(rgb(163,232,92), rgb(137,196,81));
-}
-
 #urlbar-reload-button {
-  -moz-image-region: rect(0px, 14px, 14px, 0px);
-}
-
-#urlbar-reload-button:not([disabled]):hover {
-  -moz-image-region: rect(0px, 28px, 14px, 14px);
-  background-image: -moz-linear-gradient(rgb(137,183,233), rgb(79,130,195));
+  list-style-image: url("moz-icon://stock/gtk-refresh?size=menu");
 }
 
 #urlbar-stop-button {
-  -moz-image-region: rect(0px, 42px, 14px, 28px);
-  background-image: -moz-linear-gradient(rgb(226,99,99), rgb(199,68,68));
-}
-
-#urlbar-stop-button:hover {
-  background-image: -moz-linear-gradient(rgb(237,120,120), rgb(216,92,92));
+  list-style-image: url("moz-icon://stock/gtk-stop?size=menu");
 }
 
 /* Popup blocker button */
 #page-report-button {
   list-style-image: url("chrome://browser/skin/Info.png");
 }
 
 /* Star button */
--- a/browser/themes/gnomestripe/browser/jar.mn
+++ b/browser/themes/gnomestripe/browser/jar.mn
@@ -22,17 +22,16 @@ browser.jar:
   skin/classic/browser/KUI-close.png
   skin/classic/browser/monitor.png
   skin/classic/browser/monitor_16-10.png
 * skin/classic/browser/pageInfo.css
   skin/classic/browser/pageInfo.png
   skin/classic/browser/page-livemarks.png
   skin/classic/browser/Privacy-16.png
   skin/classic/browser/Privacy-48.png
-  skin/classic/browser/reload-stop-go.png
   skin/classic/browser/searchbar.css                  (searchbar.css)
   skin/classic/browser/section_collapsed.png
   skin/classic/browser/section_collapsed-rtl.png
   skin/classic/browser/section_expanded.png
   skin/classic/browser/Secure.png
   skin/classic/browser/Security-broken.png
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/Toolbar.png
deleted file mode 100644
index 922a4c4c62e8ecd1bd380a62673dbc0b429b1756..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9fc4e1b26fd0bef86053ba1f060f75cb425fb328..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/pinstripe/browser/browser.css
+++ b/browser/themes/pinstripe/browser/browser.css
@@ -831,23 +831,20 @@ toolbar[mode="icons"] #zoom-in-button {
 
 #urlbar[focused="true"],
 .searchbar-textbox[focused="true"] {
   border-color: -moz-mac-focusring;
   box-shadow: @focusRingShadow@;
 }
 
 #urlbar {
+  -moz-padding-end: 4px;
   border-radius: @toolbarbuttonCornerRadius@;
 }
 
-#urlbar-container:not([combined]) > #urlbar {
-  -moz-padding-end: 3px;
-}
-
 #identity-box {
   background-image: -moz-linear-gradient(hsl(0,0%,98%), hsl(0,0%,92%));
   box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset;
   -moz-border-end: 1px solid hsla(0,0%,0%,.1);
   -moz-margin-end: 3px;
   padding: 1px 4px;
 }
 
@@ -905,20 +902,41 @@ toolbar[mode="icons"] #zoom-in-button {
   -moz-margin-start: 6px;
 }
 
 .urlbar-input-box {
   -moz-margin-start: 0;
   padding: 3px 0 2px;
 }
 
+.urlbar-history-dropmarker {
+  padding: 0 3px;
+  list-style-image: url("chrome://browser/skin/urlbar-history-dropmarker.png");
+  -moz-image-region: rect(0px, 11px, 14px, 0px);
+}
+
+.urlbar-history-dropmarker[open="true"],
+.urlbar-history-dropmarker:hover:active {
+  -moz-image-region: rect(0px, 22px, 14px, 11px);
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(205,100%,70%,.3), hsla(205,100%,70%,0));
+}
+
 #urlbar-icons {
   -moz-box-align: center;
 }
 
+.urlbar-icon {
+  padding: 2px 3px;
+}
+
+.urlbar-icon[open="true"],
+.urlbar-icon:hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(205,100%,70%,.3), hsla(205,100%,70%,0));
+}
+
 #urlbar-search-splitter {
   min-width: 8px;
   width: 8px;
   background-image: none;
   margin: 0 -4px;
   position: relative;
   height: 22px;
 }
@@ -970,33 +988,32 @@ toolbar[mode="icons"] #zoom-in-button {
 /* ----- AUTOCOMPLETE ----- */
 
 #treecolAutoCompleteImage {
   max-width: 36px;
 }
 
 .ac-result-type-bookmark,
 .autocomplete-treebody::-moz-tree-image(bookmark, treecolAutoCompleteImage) {
-  list-style-image: url("chrome://browser/skin/places/pageStarred.png");
-  width: 16px;
-  height: 16px;
+  list-style-image: url("chrome://browser/skin/places/star-icons.png");
+  -moz-image-region: rect(0, 32px, 16px, 16px);
 }
 
 .ac-result-type-keyword,
 .autocomplete-treebody::-moz-tree-image(keyword, treecolAutoCompleteImage) {
   list-style-image: url(chrome://global/skin/icons/search-textbox.png);
   margin: 2px;
   width: 12px;
   height: 12px;
 }
 
 richlistitem[selected="true"][current="true"] > hbox > .ac-result-type-bookmark,
 .autocomplete-treebody::-moz-tree-image(selected, current, bookmark, treecolAutoCompleteImage) {
   list-style-image: url("chrome://browser/skin/places/star-icons.png");
-  -moz-image-region: rect(32px, 16px, 48px, 0px);
+  -moz-image-region: rect(0, 64px, 16px, 48px);
 }
 
 .ac-result-type-tag,
 .autocomplete-treebody::-moz-tree-image(tag, treecolAutoCompleteImage) {
   list-style-image: url("chrome://browser/skin/places/tag.png");
   width: 16px;
   height: 16px;
 }
@@ -1031,134 +1048,95 @@ richlistitem[type~="action"][actiontype=
   color: GrayText;
   font-size: smaller;
 }
 
 .autocomplete-treebody::-moz-tree-cell(suggesthint) {
   border-top: 1px solid GrayText;
 }
 
-/* ----- GO BUTTON ----- */
-
-#go-button {
-  list-style-image: url("chrome://browser/skin/Go-arrow.png");
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-#go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
-  -moz-transform: scaleX(-1);
-}
-
-#go-button:hover {
-  -moz-image-region: rect(0px, 32px, 16px, 16px);
-}
-
-#go-button:hover:active {
-  -moz-image-region: rect(0px, 48px, 16px, 32px);
-}
 
 /* ----- COMBINED GO/RELOAD/STOP BUTTON IN LOCATION BAR ----- */
 
+#go-button,
 #urlbar > toolbarbutton {
-  list-style-image: url("chrome://browser/skin/reload-stop-go.png");
   margin: 0;
-  -moz-margin-start: 2px;
-  padding: 0 3px;
+  -moz-padding-start: 2px; 
+  -moz-padding-end: 1px; 
   background-origin: border-box;
-  border: none;
-  -moz-border-start: 1px solid rgba(0,0,0,.25);
-  box-shadow: 0 1px 0 rgba(0,0,0,.1) inset,
-              -1px -1px 1px rgba(255,255,255,.15) inset;
-}
-
-#urlbar:-moz-locale-dir(ltr) > toolbarbutton {
-  border-top-right-radius: 2px;
-  border-bottom-right-radius: 2px;
-}
-
-#urlbar:-moz-locale-dir(rtl) > toolbarbutton {
-  border-top-left-radius: 2px;
-  border-bottom-left-radius: 2px;
-}
-
-#urlbar > toolbarbutton:not([disabled]):active:hover,
-#urlbar-reload-button:not(:hover) {
-  -moz-border-start-style: none;
-  -moz-padding-start: 4px;
-  box-shadow: none;
-}
-
-#urlbar > toolbarbutton:not([disabled]):active:hover {
-  box-shadow: @toolbarbuttonPressedInnerShadow@;
-}
-
+  list-style-image: url("chrome://browser/skin/reload-stop-go.png");
+}
+
+#urlbar > toolbarbutton:not([disabled]):hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(205,100%,70%,.3), hsla(205,100%,70%,0));
+}
+
+#go-button {
+  padding: 0 3px;
+}
+
+#go-button,
 #urlbar-go-button {
-  -moz-image-region: rect(0px, 56px, 14px, 42px);
-  background-image: -moz-linear-gradient(rgb(184,221,142), rgb(154,201,111) 49%, rgb(130,187,92) 51%, rgb(114,171,79));
-}
-
+  -moz-image-region: rect(0, 42px, 14px, 28px);
+}
+
+#go-button:hover:active,
+#urlbar-go-button:hover:active {
+  -moz-image-region: rect(14px, 42px, 28px, 28px);
+}
+
+#go-button:-moz-locale-dir(rtl),
 #urlbar-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
   -moz-transform: scaleX(-1);
 }
 
 #urlbar-reload-button {
-  -moz-image-region: rect(0px, 14px, 14px, 0px);
-}
-
-#urlbar-reload-button:not([disabled]):hover {
-  -moz-image-region: rect(0px, 28px, 14px, 14px);
-  background-image: -moz-linear-gradient(rgb(162,207,241), rgb(111,178,225) 49%, rgb(91,159,217) 51%, rgb(62,138,200));
+  -moz-image-region: rect(0, 14px, 14px, 0);
+}
+
+#urlbar-reload-button:not([disabled]):hover:active {
+  -moz-image-region: rect(14px, 14px, 28px, 0);
+}
+
+#urlbar-reload-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
+  -moz-transform: scaleX(-1);
 }
 
 #urlbar-stop-button {
-  -moz-image-region: rect(0px, 42px, 14px, 28px);
-  background-image: -moz-linear-gradient(rgb(231,162,140), rgb(209,119,100) 49%, rgb(193,92,78) 51%, rgb(173,72,58));
+  -moz-image-region: rect(0, 28px, 14px, 14px);
+}
+
+#urlbar-stop-button:hover:active {
+  -moz-image-region: rect(14px, 28px, 28px, 14px);
 }
 
 /* POPUP BLOCKER BUTTON */
 #page-report-button {
   list-style-image: url("chrome://browser/skin/urlbar-popup-blocked.png");
   -moz-image-region: rect(0, 16px, 16px, 0);
 }
 
-#page-report-button:hover {
-  -moz-image-region: rect(0, 32px, 16px, 16px);
-}
-
 #page-report-button:hover:active,
 #page-report-button[open="true"] {
-  -moz-image-region: rect(0, 48px, 16px, 32px);
+  -moz-image-region: rect(0, 32px, 16px, 16px);
 }
 
 /* STAR BUTTON */
 #star-button {
-  padding: 1px;
-  -moz-padding-start: 4px;
   list-style-image: url("chrome://browser/skin/places/star-icons.png");
   -moz-image-region: rect(0, 16px, 16px, 0);
 }
 
-#star-button:hover {
+#star-button:hover:active,
+#star-button[starred="true"] {
   -moz-image-region: rect(0, 32px, 16px, 16px);
 }
 
-#star-button:hover:active {
-  -moz-image-region: rect(0, 48px, 16px, 32px);
-}
-
-#star-button[starred="true"] {
-  -moz-image-region: rect(16px, 16px, 32px, 0);
-}
-
-#star-button:hover[starred="true"] {
-  -moz-image-region: rect(16px, 32px, 32px, 16px);
-}
-
 #star-button:hover:active[starred="true"] {
-  -moz-image-region: rect(16px, 48px, 32px, 32px);
+  -moz-image-region: rect(0, 48px, 16px, 32px);
 }
 
 /* BOOKMARKING PANEL */
 #editBookmarkPanelStarIcon {
   list-style-image: url("chrome://browser/skin/places/starred48.png");
   width: 48px;
   height: 48px;
 }
--- a/browser/themes/pinstripe/browser/jar.mn
+++ b/browser/themes/pinstripe/browser/jar.mn
@@ -9,17 +9,16 @@ browser.jar:
   skin/classic/browser/aboutSyncTabs.css
 #endif
   skin/classic/browser/actionicon-tab.png
 * skin/classic/browser/browser.css                          (browser.css)
 * skin/classic/browser/engineManager.css                    (engineManager.css)
   skin/classic/browser/fullscreen-video.css
   skin/classic/browser/Geolocation-16.png
   skin/classic/browser/Geolocation-64.png
-  skin/classic/browser/Go-arrow.png
   skin/classic/browser/home.png
   skin/classic/browser/hud-style-check-box-checked.png
   skin/classic/browser/hud-style-check-box-empty.png
   skin/classic/browser/hud-style-dropmarker-double-arrows.png
   skin/classic/browser/hud-style-expander-closed.png
   skin/classic/browser/hud-style-expander-open.png
   skin/classic/browser/hud-style-new-folder-plus-sign.png
   skin/classic/browser/hud-style-twisties.png
@@ -40,16 +39,17 @@ browser.jar:
   skin/classic/browser/Search.png
   skin/classic/browser/section_collapsed.png
   skin/classic/browser/section_collapsed-rtl.png
   skin/classic/browser/section_expanded.png
   skin/classic/browser/Secure-Glyph-White.png
   skin/classic/browser/keyhole-circle.png
   skin/classic/browser/Toolbar.png
   skin/classic/browser/toolbarbutton-dropmarker.png
+  skin/classic/browser/urlbar-history-dropmarker.png
   skin/classic/browser/urlbar-arrow.png
   skin/classic/browser/urlbar-popup-blocked.png
   skin/classic/browser/feeds/subscribe.css                  (feeds/subscribe.css)
   skin/classic/browser/feeds/subscribe-ui.css               (feeds/subscribe-ui.css)
   skin/classic/browser/feeds/feedIcon.png                   (feeds/feedIcon.png)
   skin/classic/browser/feeds/feedIcon16.png                 (feeds/feedIcon16.png)
   skin/classic/browser/feeds/videoFeedIcon.png              (feeds/videoFeedIcon.png)
   skin/classic/browser/feeds/videoFeedIcon16.png            (feeds/videoFeedIcon16.png)
@@ -71,17 +71,16 @@ browser.jar:
   skin/classic/browser/places/toolbarDropMarker.png         (places/toolbarDropMarker.png)
   skin/classic/browser/places/folderDropArrow.png           (places/folderDropArrow.png)
   skin/classic/browser/places/editBookmarkOverlay.css       (places/editBookmarkOverlay.css)
   skin/classic/browser/places/minus.png                     (places/minus.png)
   skin/classic/browser/places/minus-active.png              (places/minus-active.png)
   skin/classic/browser/places/plus.png                      (places/plus.png)
   skin/classic/browser/places/plus-active.png               (places/plus-active.png)
   skin/classic/browser/places/starPage.png                  (places/starPage.png)
-  skin/classic/browser/places/pageStarred.png               (places/pageStarred.png)
   skin/classic/browser/places/searching_16.png              (places/searching_16.png)
   skin/classic/browser/places/starred48.png                 (places/starred48.png)
   skin/classic/browser/places/unstarred48.png               (places/unstarred48.png)
   skin/classic/browser/places/unfiledBookmarks.png          (places/unfiledBookmarks.png)
   skin/classic/browser/places/twisty-open.gif               (places/twisty-open.gif)
   skin/classic/browser/places/twisty-closed.gif             (places/twisty-closed.gif)
   skin/classic/browser/places/tag.png                       (places/tag.png)
   skin/classic/browser/places/downloads.png                 (places/downloads.png)
deleted file mode 100644
index 9f025f744eff57c84c1fc948670962941cec09f8..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index 30d73dd79991103380627a80e3557b8bf56dc7f0..e5610bace4e1ce8b011df55b348bea29a4ecf61f
GIT binary patch
literal 1906
zc$@)p2aWiNP)<h;3K|Lk000e1NJLTq002M$000mO1^@s6rssJn000L$Nkl<Zc-ozp
zeNdFw6~?z?AiA&!h>%@HVj3+mp`gT7Obrp@+C<c3hN`2f8o#ojNoZt}n&Oy5{3swq
zKxJ7lM1g?CAOwsERzwl35f%Zvl;uOj;sVaX3Q_py>ACORrAzwmHj$a%aORxn4D+1(
z@m?hH@$sS@K73e`l$4Z5WKe8V=eDuL9(hEDJq-YxJf&3U5g9CgLUM_8dm2$w2?+_3
zBS(%XFJ8Qe^73*}96&ko0c<F;h4T66%Xscjmq2lVEgb++9F&ntr<KWYTJa?ulo0_>
zV17RFBgg+24InWwQIeaRTi)5(iH?pA<mBWO+u8-L?|duH`hv0$Z9A4|450X|4V_H`
z(vX-kw`~{TwzUk>C7+&sf&mm0CeCSFI?>fnPEJ<V)YQOiHe+yb5ZA6<v$+dg*PRwa
z`Rk~1tSTSDTg1!{%0RgQ5uNzzFNjpiR-b@JbOStg=^*<<CMXy13s--D=;fGg?Sh}0
zpFn3mu(-JR?_FJ8c>MUW0E-I?3oo!5(~KLy+FWZU5P`01vMWN;{)OO@VSy#b^l)99
zbDq_>#-bm8=I3vpKxaPC`OO0rQ+8Z}*I!x$+#@eS`bO+|R%04F##wD1@f~3#dKf$|
z;<a)8?4pa%YPCiA`T4CSB_*h?u7<&25LSO=WQ4(DmJ@1BLt1@$dU_G{ZkfFLWCT$}
zw7RZ2g_%1_u=KbdtIj{dto%XDCf=f$azc%1NUP^PTb^2=j&NN3QPCvTXRXq(c*s_3
z;jTUp&)rRUW^Wrqh~3oR3pMHTI80pnnV$7f?-l^tiN6tz#1Jva4R;fFIo&)r$Td3N
zvq_Sfnb}icUyttYZuIr_VPIeY!^6YE%JTuRnB|08Z*Q-#BkJnvK!fX;9G-FS^`lK#
zU(^qE<p?%aJjSYX!+1W&gy*saFpFZ!v6`S+SJ;Qp)J9ORVd87i_gpvS!6T{?o*!SQ
z6>lKZddR<MgM42*gJJ{Au^Q8m_7Yq-=HlsBKQaJlA?_1hM90shi}&1;kdY0wwYBC4
z4<1-d+l6WR`};w6go%3BIlb~h=;XK4O#bmYEG{r(X4V6{FpYm)J*cPO>6Q0`SA47u
zb=z>t<h4f!#ld!>(>|o}iqXOCk6HaIKhXvQ@FSXuHlp=s($06x90>qtolduz%nZ>A
z|6lValL<F&+%PvZG;9LkB#}rQq>FZ{Tvn!-Up!QY-{lYB*^E9>SZ&UMA3$1@G$=BZ
z^#X8M{z<0FecNfXd|xxB#or;iY;cEmLlfM$=9yOR{wkF9^0VyEhtNXYwg=bTB3`oG
z0TKYRn>TN&o12?|92y$3IRI8`Y-}8217m|@y)G-hl<*;hxvWSU3Od;b-^@PDNHdOO
z&WS!O{MrbYuq3l|VT6kHuwHJ!VOexWn8$~uL(}5hF+J&?DAVHF;IZ>NbJ(9xs4V8K
zc$ph(<iEveB6QYY1a|XVhTwAf^5sI>-Zlro?ug3D$~-nO>JfTfmd6XwkE2ZWMb@0X
z)tLWPKfF_V#<Ae*e)z^zL8kgVjhW|t)&?A>Z`Ncf4*rwrMUfw9g7>?}(=6si*w2mD
ziNR}otb44#{gTqs(ki;-Y!1L^G=e^n6-;Y+6Ug2;_+Ne>TfQjq7W~qT!ixRoXb)zm
z_6YHBHAVy_=pb7bTWZxa&VbvR#BxR4ZMI`XQT&y@2CEZFxn7KHZuB2w@LHDWJAfWK
zl8TCof78Q9F#G7yBevxkEM__3{FjxL8Av<UCtJ2}4B7#AgEgIaIsHC@GK`p;a2xXy
z^+Ft|xsSz14QvPKt$M}}U}O5-87ZB@ec_XCgwOGA;vSyW8iky9vH|WJkL&FW;3{#Q
zs3B@u%;0eik1vQ0ASETmnQnH$FuM%f+uK3+LMvU4o%9?Qat|Lq#MP@;M@j2AHh`sj
zEjYWqxgW1)_QEf=4%0WEf-E$qN%s1l7VmA}!2jSa1ZVVsbfbi$r4N9>)31H#JY{D-
ze6&57ajcU*e>G6-I@_d(E^1N4)(SZvO*f`Q=8TfoQN+9xzvQa9;d<g*qL{CI4X-s4
zj{kE6G#bskD_5?dt*wnccsj}G=lo)sUsY9gh=$X}hC=rQNc)222snqv5JbqQbEmIO
zCga(lxJ9~9t){a+mGG1<ij1P1!Fy{C<l%{MUb5Sl_l+5lsiNn)M`lB@zZPCQvs(gp
z98&|BN_hIcmlEamey%}r;5yvZC*h)s_7xd`A2;^{Q9^`S)xwEVUTY?1S!!ed`qB$;
z_L(zhs+d{+miA0dO_eYJJTp2vx{%Dr6%-Uy(OofPYycs<1*Aa{K2E{W=cGaEC}x_N
zWU0}Q^j8xn%c-_Y&@9+4=e02dzUyOsriRC!^HZlpvA<1BvN9mOV>HQMdM|m`)bM@h
s0^U6&7a0J{r7^R1p2=&t#>0~T56HDsY7y&<qW}N^07*qoM6N<$g4uqwqW}N^
index 0406477f52e20d343d5d7903aee28d6d05bcbc63..699ef2326e0561a10742dff28711cfc4c77edd56
GIT binary patch
literal 912
zc$@){18@9^P)<h;3K|Lk000e1NJLTq001fg000~a1^@s67vL@H000A5Nkl<Zc-rOG
z&x;dh9LMoqdmV`TXl&|eN<k0=uRRHS68awqLQkFwUMdQ9!|pQ6?y^6~{t8%nXjd$@
z7O(yda}pkS>a>=pq_j<I8wnKxg-_pyQIpLxlUZb;(!=YJZ=U&nznNubKW|BTBOL1R
z-rinvREu;vo%49V(xN*%J2l+KQwR<n7$i`^kjpTEdW4TE+<>#_p^Lb5(XFkmS@fWQ
zA%uxVcXxNMK(H_)^$011kINR#Z-j&3Q4cP<xw%<G55hj0dA)%Q%1tb~y}fPVAXpeg
zNFjK{)9z}!-8QfgGSnv)U0+}CK-eGslFtb=Dl~*2VBjEFq!2uUOP2JpBYn)+qN}T`
zT?h?HFKP*NP|=XJwKW3=<vik&^Qyq2_HxnX<>ev%d7Y=0>m#I4&cYO(Us+jE1sUou
z7fq7HLuej)NpM|+6oQ9?U}38ESz21E;Sq!k^|3$w;^JZ(!o5%f>Tee{Usza(kV5c?
zVc;NGOkI{41{Q+D<ij*SKVL^5!hM{}>lg3<9v_AVv|6pJ5Io|Mx`Bgmy=+N(8(0Vq
z;n!2%_#y^SKp!6z4Vs&qyM{PWHz-{)pFN8q9O|Jn2OBrA0f*;!h!*mTj}9{~!Ib?A
z{ZILSE!zBMaAfJ}y>I_Mk80`Z%vaB9xQ(X}96B&apn@TnVFL9CQ`1xP>%m#{&_#KA
zI{oEev*<wqLkOA}a&K@2f`u8WM@S)*rl&J^pBXp^9^u#1sn7qYp$B0f&Ai?~2IVFe
zJ$<Kd;2>BSL`WfcObsUS7k?U92pJ|{`0sXl9SCFTiO&f%Dl~*2VBjEFq!2tRr>9e&
z{cd0(Sd6EqciO*nAv7ets3p)rMME09zZp0v=Mfj5|5X)Oyh=|e*SbTzR(d+Q{&R#B
z%2}Ag^BbI*F2k$zbYjVS2!~Hk;JOGY1P=$nqH=nwFaK1-BM2GB)6?<!Cv6D9^hCWd
zJ(<>%2q^@Q7zPf4#nfewFZ^g=AvjDvOf$E>ucHs)KF;O!3wQvJV0xOlnO%k85s%aj
z9E8$fVm|%Bz(Q~+PEW^fJidql6wpUudOG&Wch?XH>IPHO)69*>vlzl*dU~R10~>I7
mj)!RB$kP)uF5%5jPyYfEhJw@=xn~am0000<MNUMnLSTZ9DVa|I
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..53bd1cb0ca3a69eb5846f44d5ab2c7bacdc70e62
GIT binary patch
literal 389
zc$@)+0eb$4P)<h;3K|Lk000e1NJLTq000&M000gM1^@s6D>3ZN0003@Nkl<Zc-rmL
zy-LGS7zW_hic$)?skEpF1*cv>cb%QR1h2q?gOfOjgNx7$@B%Cv!Of<mttPFMBS~Xg
zn$(2oV!<i|3$I@a(SYfXgW%xsa5!*y;rlru0Keit_$&A{mrHZpMUO8OAPB{8@;r~T
zbIzf6spafbn)C>Ua7fBcpDC8gCyJs#*L4_%;pyLHSw^XRodpmhp`~McpJ0g0XDhnh
z*Hx)fZ5T!ywrzX*;gVEgj^nI&B`zLWQ=~=^Kp+u+k0%<<<|boz@1|+?L*0`x_SVw%
z4FF+({}Ko76mbZAUPv-%crj6`WHn8LWm!<wdsM5phXA5M!-?;;G6X(b1GmC0nZj9J
zRUwMf4S@KdsW0p{B19k{m!sA#?3R9&=N}(TbA8lG&F`p5qLaipdmMf4bk+b&kF&3H
j+x6L>e2~dM`|~~kic*Ihb0ca%00000NkvXXu0mjf+@!4A
index 0bbc27e2294d83c7fce14973966bd4817074e46a..8c4f4d96f06ed2067f62d012d1f91ab1b98503f8
GIT binary patch
literal 758
zc$@+D0tx+zP)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^0008LNkl<Zc-p1a
z-%C?r7zgm?Hh&b+mA_JFOKnk67u`i5NP-~<g8xAfT?lm}X%V_H*IL?ILt8-@k`Y4P
zMi=2lbZ1>Ch4aT0J4aJHy3(6nJ$;|?yz6xgZFTYCeV_L{XYcnM&dxbNME~UKM4Al>
zzzz;@Lg5~q(r1_RZ0R41#bWJX0qsZn+Oz=n6K{4p>R<0zK!3qPe><O-2{1f7YyjoK
z(5~K5H~z~6%7ZC)q97e$XlRJ?rLG>F$6qEXUwmFBKr|X9(a3c!($}PV^#JbCO=6z0
zt!C84P^2kVJTJCdq<43KNF+jx=len56<F5;9DDYIm~1Eyo5%`LH)35w@5ZhG;c%Eh
z51`fy!3$r2c$B(I4^SIhBPN@xr`*vvzJ193WZjQrUx9c;-G64pa!UYvdZU4X0b=^*
zs7qiHD2K^lBz8~*sEMu;Q-3pd{`ux%tbGE?=8CR<zA*OlNG3oi6e6YvK<$_HIk*U=
zV8|NW_p1Qa4-8`Z?RSOEyRtrC_h_Z*+|!L}%uUtH$2n+vvtTetOb>uMA?r<03R6-W
zGA2}js(Z`Cv<I&c^&*ga&}cdPc&!@qY3Va%T+9Rr1Og;lP^-0+thr%I<}=`uc}fMS
z>|Y{Q8(MBt4;$(fkSA=O#5gTIanHk*2AQY$-1KICzkd}-<AMZ`c5DVJpjqmKdJ$E4
z7rp~2p22So7#D%GWARgAv(^<@YL)uW9q{>l%`gWfI-yIelTZ(BV8~jR`X^L*6PL^H
z%+CX{qrD3^Dti}tq-M$b;PUAjU!ntZ69~t<)kBz**Xy;zd!QWNf<60VB%G}E)pkkw
z?b(U4TeFl6>+dd&ZWXEbz@Ga0`a0nQSTc6X*HE#E0!9BiR`kqXFYk_jEV~)Ec;s4p
oSJ?jdbF8!JR1o1%^iMJS4R$)?zL<C|I{*Lx07*qoM6N<$f*~7VO8@`>
deleted file mode 100644
index 1f76506488a6613146fc335961b739efc66eca10..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 851ae1615dd175ade57fd2b2ac0caa9b7c4b5b17..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/winstripe/browser/browser.css
+++ b/browser/themes/winstripe/browser/browser.css
@@ -1178,31 +1178,32 @@ toolbar[mode="full"] .toolbarbutton-1 > 
   -moz-image-region: rect(16px, 48px, 32px, 32px);
 }
 #close-button:hover:active {
   -moz-image-region: rect(32px, 48px, 48px, 32px);
 }
 
 /* ::::: Location Bar ::::: */
 
-#urlbar {
-  width: 7em;
-  min-width: 7em;
-}
-
 #urlbar,
 .searchbar-textbox {
   -moz-appearance: none;
   margin: 1px 3px;
-  padding: 2px;
+  padding: 0;
   background-clip: padding-box;
   border: 1px solid ThreeDShadow;
   border-radius: 2.5px;
 }
 
+#urlbar {
+  width: 7em;
+  min-width: 7em;
+  -moz-padding-end: 2px;
+}
+
 @media all and (-moz-windows-default-theme) {
   #urlbar,
   .searchbar-textbox {
     @navbarTextboxCustomBorder@
   }
 }
 
 #urlbar:-moz-lwtheme,
@@ -1227,44 +1228,55 @@ html|*.urlbar-input:-moz-lwtheme:-moz-pl
   -moz-box-align: stretch;
 }
 
 .urlbar-textbox-container {
   -moz-box-align: stretch;
 }
 
 #urlbar-icons {
-  height: 18px;
   -moz-box-align: center;
 }
 
 .urlbar-icon {
-  padding: 0 2px !important;
+  padding: 3px 3px;
+}
+
+.searchbar-engine-button,
+.search-go-container {
+  padding: 2px 2px;
 }
 
 .urlbar-icon:-moz-system-metric(touch-enabled) {
   -moz-margin-end: 1px !important;
   padding: 0 3px !important;
 }
 
+.urlbar-icon:hover {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(200,100%,70%,.3), hsla(200,100%,70%,0));
+}
+
+.urlbar-icon[open="true"],
+.urlbar-icon:hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(200,100%,70%,.1), hsla(200,100%,70%,0));
+}
+
 #urlbar-search-splitter {
   min-width: 6px;
   -moz-margin-start: -3px;
   border: none;
   background: transparent;
 }
 
 #urlbar-search-splitter + #urlbar-container > #urlbar ,
 #urlbar-search-splitter + #search-container > #searchbar > .searchbar-textbox {
   -moz-margin-start: 0;
 }
 
 #urlbar-display-box {
-  margin-top: -2px;
-  margin-bottom: -2px;
   -moz-border-end: 1px solid #AAA;
   -moz-margin-end: 3px;
 }
 
 #urlbar-display {
   margin-top: 0;
   margin-bottom: 0;
   color: GrayText;
@@ -1272,18 +1284,16 @@ html|*.urlbar-input:-moz-lwtheme:-moz-pl
 
 /* identity box */
 
 #identity-box {
   background-image: -moz-linear-gradient(hsl(0,0%,98%), hsl(0,0%,92%));
   box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset;
   -moz-border-end: 1px solid hsla(0,0%,0%,.1);
   padding: 2px;
-  margin: -2px;
-  -moz-margin-end: 0;
 }
 
 #identity-box:-moz-locale-dir(ltr) {
   border-top-left-radius: 1.5px;
   border-bottom-left-radius: 1.5px;
 }
 
 #identity-box:-moz-locale-dir(rtl) {
@@ -1347,31 +1357,37 @@ html|*.urlbar-input:-moz-lwtheme:-moz-pl
   -moz-margin-start: 1px;
   -moz-margin-end: 3px;
 }
 
 /* Location bar dropmarker */
 
 .urlbar-history-dropmarker {
   -moz-appearance: none;
-  padding: 0 1px;
+  padding: 0 3px;
   background-color: transparent;
   border: none;
   width: auto;
-  list-style-image: url(mainwindow-dropdown-arrow.png);
-  -moz-image-region: rect(0, 13px, 11px, 0);
+  list-style-image: url("chrome://browser/skin/urlbar-history-dropmarker.png");
+  -moz-image-region: rect(0px, 11px, 14px, 0px);
 }
 
 .urlbar-history-dropmarker:-moz-system-metric(touch-enabled) {
   min-width: 6.4mozmm;
 }
 
+.urlbar-history-dropmarker:hover {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(205,100%,70%,.3), hsla(205,100%,70%,0));
+  -moz-image-region: rect(0px, 22px, 14px, 11px);
+}
+
 .urlbar-history-dropmarker:hover:active,
 .urlbar-history-dropmarker[open="true"] {
-  -moz-image-region: rect(0, 26px, 11px, 13px);
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(205,100%,70%,.1), hsla(205,100%,70%,0));
+  -moz-image-region: rect(0px, 33px, 14px, 22px);
 }
 
 /* page proxy icon */
 
 #page-proxy-favicon,
 #urlbar-throbber {
   width: 16px;
   height: 16px;
@@ -1464,97 +1480,83 @@ richlistitem[type~="action"][actiontype=
   color: GrayText;
   font-size: smaller;
 }
 
 .autocomplete-treebody::-moz-tree-cell(suggesthint) {
   border-top: 1px solid GrayText;
 }
 
-/* go button */
-
-#go-button {
-  list-style-image: url("chrome://browser/skin/Go-arrow.png");
-  -moz-image-region: rect(0px, 16px, 16px, 0px);
-}
-
-#go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
-  -moz-transform: scaleX(-1);
-}
-
-#go-button:hover {
-  -moz-image-region: rect(16px, 16px, 32px, 0px);
-}
-
 /* combined go/reload/stop button in location bar */
 
+#go-button,
 #urlbar > toolbarbutton {
   -moz-appearance: none;
-  list-style-image: url("chrome://browser/skin/reload-stop-go.png");
-  margin: -2px;
-  -moz-margin-start: 0;
-  padding: 0 3px;
+  padding: 0 2px;
   background-origin: border-box;
   border: none;
-  -moz-border-start: 1px solid rgba(0,0,0,.25);
-  box-shadow: 0 1px 0 rgba(0,0,0,.1) inset,
-              -1px -1px 1px rgba(255,255,255,.25) inset;
-}
-
-#urlbar:-moz-locale-dir(ltr) > toolbarbutton {
-  border-top-right-radius: 1.5px;
-  border-bottom-right-radius: 1.5px;
-}
-
-#urlbar:-moz-locale-dir(rtl) > toolbarbutton {
-  border-top-left-radius: 1.5px;
-  border-bottom-left-radius: 1.5px;
-}
-
-#urlbar > toolbarbutton:not([disabled]):active:hover,
-#urlbar-reload-button:not(:hover) {
-  -moz-border-start-style: none;
-  -moz-padding-start: 4px;
-  box-shadow: none;
-}
-
-#urlbar > toolbarbutton:not([disabled]):active:hover {
-  box-shadow: 0 0 6.5px rgba(0,0,0,.4) inset,
-              0 0 2px rgba(0,0,0,.4) inset;
-}
-
-#urlbar-go-button {
-  -moz-image-region: rect(0px, 56px, 14px, 42px);
-  background-image: -moz-linear-gradient(rgb(115,213,115), rgb(96,190,96) 49%, rgb(82,174,82) 51%, rgb(79,155,79));
-}
-
-#urlbar-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
-  -moz-transform: scaleX(-1);
-}
-
-#urlbar-go-button:hover {
-  background-image: -moz-linear-gradient(rgb(96,221,96), rgb(71,191,71) 49%, rgb(54,171,54) 51%, rgb(50,147,50));
+  list-style-image: url("chrome://browser/skin/reload-stop-go.png");
+}
+
+#go-button {
+  padding: 0 3px;
 }
 
 #urlbar-reload-button {
-  -moz-image-region: rect(0px, 14px, 14px, 0px);
+  -moz-image-region: rect(0, 14px, 14px, 0);
 }
 
 #urlbar-reload-button:not([disabled]):hover {
-  -moz-image-region: rect(0px, 28px, 14px, 14px);
-  background-image: -moz-linear-gradient(rgb(162,207,241), rgb(111,178,225) 49%, rgb(91,159,217) 51%, rgb(62,138,200));
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(200,100%,70%,.2), hsla(200,100%,70%,0));
+  -moz-image-region: rect(14px, 14px, 28px, 0);
+}
+
+#urlbar-reload-button:not([disabled]):hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(200,100%,60%,.1), hsla(200,100%,60%,0));
+  -moz-image-region: rect(28px, 14px, 42px, 0);
+}
+
+#urlbar-reload-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
+  -moz-transform: scaleX(-1);
+}
+
+#go-button,
+#urlbar-go-button {
+  -moz-image-region: rect(0, 42px, 14px, 28px);
+}
+
+#go-button:hover,
+#urlbar-go-button:hover {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(110,70%,50%,.2), hsla(110,70%,50%,0));
+  -moz-image-region: rect(14px, 42px, 28px, 28px);
+}
+
+#go-button:hover:active,
+#urlbar-go-button:hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(110,70%,50%,.1), hsla(110,70%,50%,0));
+  -moz-image-region: rect(28px, 42px, 42px, 28px);
+}
+
+#go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon,
+#urlbar-go-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
+  -moz-transform: scaleX(-1);
 }
 
 #urlbar-stop-button {
-  -moz-image-region: rect(0px, 42px, 14px, 28px);
-  background-image: -moz-linear-gradient(rgb(231,162,140), rgb(209,119,100) 49%, rgb(193,92,78) 51%, rgb(173,72,58));
-}
-
-#urlbar-stop-button:hover {
-  background-image: -moz-linear-gradient(rgb(244,156,128), rgb(215,101,77) 49%, rgb(194,66,48) 51%, rgb(170,41,23));
+  -moz-image-region: rect(0, 28px, 14px, 14px);
+}
+
+#urlbar-stop-button:not([disabled]):hover {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(5,100%,75%,.3), hsla(5,100%,75%,0));
+  -moz-image-region: rect(14px, 28px, 28px, 14px);
+}
+
+#urlbar-stop-button:hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(5,100%,75%,.1), hsla(5,100%,75%,0));
+  -moz-image-region: rect(28px, 28px, 42px, 14px);
 }
 
 /* popup blocker button */
 
 #page-report-button {
   list-style-image: url("chrome://browser/skin/urlbar-popup-blocked.png");
   -moz-image-region: rect(0, 16px, 16px, 0);
 }
@@ -1571,20 +1573,22 @@ richlistitem[type~="action"][actiontype=
 /* star button */
 
 #star-button {
   list-style-image: url("chrome://browser/skin/places/bookmark.png");
   -moz-image-region: rect(0px 16px 16px 0px);
 }
 
 #star-button:hover {
-  -moz-image-region: rect(0px 32px 16px 16px);
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(45,100%,73%,.3), hsla(45,100%,73%,0));
+  -moz-image-region: rect(0px 32px 16px 16px); 
 }
 
 #star-button:hover:active {
+  background-image: -moz-radial-gradient(center, circle closest-side, hsla(45,100%,73%,.1), hsla(45,100%,73%,0));
   -moz-image-region: rect(0px 48px 16px 32px);
 }
 
 #star-button[starred="true"] {
   list-style-image: url("chrome://browser/skin/places/editBookmark.png");
 }
 
 /* bookmarking panel */
@@ -2220,18 +2224,16 @@ toolbarbutton.bookmark-item[dragover="tr
 #notification-popup-box {
   position: relative;
   background-color: #fff;
   background-clip: padding-box;
   padding-left: 3px;
   border-radius: 2.5px 0 0 2.5px;
   -moz-border-image: url("chrome://browser/skin/urlbar-arrow.png") 0 8 0 0 / 0 8px 0 0;
   -moz-margin-end: -8px;
-  margin-top: -2px;
-  margin-bottom: -2px;
 }
 
 #notification-popup-box:not([hidden]) + #identity-box {
   -moz-padding-start: 10px;
   border-radius: 0;
 }
 
 #notification-popup-box:-moz-locale-dir(rtl),
--- a/browser/themes/winstripe/browser/jar.mn
+++ b/browser/themes/winstripe/browser/jar.mn
@@ -32,28 +32,28 @@ browser.jar:
         skin/classic/browser/livemark-item.png                       (livemark-item.png)
         skin/classic/browser/livemark-folder.png                     (livemark-folder.png)
         skin/classic/browser/Privacy-16.png
         skin/classic/browser/Privacy-48.png
         skin/classic/browser/reload-stop-go.png
         skin/classic/browser/Secure24.png                            (Secure24.png)
         skin/classic/browser/Toolbar.png                             (Toolbar.png)
         skin/classic/browser/Toolbar-inverted.png
-        skin/classic/browser/Go-arrow.png                            (Go-arrow.png)
 *       skin/classic/browser/searchbar.css                           (searchbar.css)
         skin/classic/browser/section_collapsed.png
         skin/classic/browser/section_collapsed-rtl.png
         skin/classic/browser/section_expanded.png
         skin/classic/browser/setDesktopBackground.css
         skin/classic/browser/menu-back.png                           (menu-back.png)
         skin/classic/browser/menu-forward.png                        (menu-forward.png)
         skin/classic/browser/monitor.png
         skin/classic/browser/monitor_16-10.png
         skin/classic/browser/urlbar-arrow.png
         skin/classic/browser/urlbar-popup-blocked.png
+        skin/classic/browser/urlbar-history-dropmarker.png
         skin/classic/browser/feeds/feedIcon.png                      (feeds/feedIcon.png)
         skin/classic/browser/feeds/feedIcon16.png                    (feeds/feedIcon16.png)
         skin/classic/browser/feeds/audioFeedIcon.png                 (feeds/audioFeedIcon.png)
         skin/classic/browser/feeds/audioFeedIcon16.png               (feeds/audioFeedIcon16.png)
         skin/classic/browser/feeds/videoFeedIcon.png                 (feeds/videoFeedIcon.png)
         skin/classic/browser/feeds/videoFeedIcon16.png               (feeds/videoFeedIcon16.png)
         skin/classic/browser/feeds/subscribe.css                     (feeds/subscribe.css)
         skin/classic/browser/feeds/subscribe-ui.css                  (feeds/subscribe-ui.css)
@@ -154,28 +154,28 @@ browser.jar:
         skin/classic/aero/browser/livemark-item.png                  (livemark-item-aero.png)
         skin/classic/aero/browser/livemark-folder.png                (livemark-folder-aero.png)
         skin/classic/aero/browser/Privacy-16.png                     (Privacy-16-aero.png)
         skin/classic/aero/browser/Privacy-48.png                     (Privacy-48-aero.png)
         skin/classic/aero/browser/reload-stop-go.png
         skin/classic/aero/browser/Secure24.png                       (Secure24-aero.png)
         skin/classic/aero/browser/Toolbar.png
         skin/classic/aero/browser/Toolbar-inverted.png
-        skin/classic/aero/browser/Go-arrow.png                       (Go-arrow-aero.png)
 *       skin/classic/aero/browser/searchbar.css                      (searchbar.css)
         skin/classic/aero/browser/section_collapsed.png
         skin/classic/aero/browser/section_collapsed-rtl.png
         skin/classic/aero/browser/section_expanded.png
         skin/classic/aero/browser/setDesktopBackground.css
         skin/classic/aero/browser/menu-back.png                      (menu-back-aero.png)
         skin/classic/aero/browser/menu-forward.png                   (menu-forward-aero.png)
         skin/classic/aero/browser/monitor.png
         skin/classic/aero/browser/monitor_16-10.png
         skin/classic/aero/browser/urlbar-arrow.png
         skin/classic/aero/browser/urlbar-popup-blocked.png
+        skin/classic/aero/browser/urlbar-history-dropmarker.png
         skin/classic/aero/browser/feeds/feedIcon.png                 (feeds/feedIcon-aero.png)
         skin/classic/aero/browser/feeds/feedIcon16.png               (feeds/feedIcon16-aero.png)
         skin/classic/aero/browser/feeds/audioFeedIcon.png            (feeds/audioFeedIcon-aero.png)
         skin/classic/aero/browser/feeds/audioFeedIcon16.png          (feeds/audioFeedIcon16-aero.png)
         skin/classic/aero/browser/feeds/videoFeedIcon.png            (feeds/videoFeedIcon-aero.png)
         skin/classic/aero/browser/feeds/videoFeedIcon16.png          (feeds/videoFeedIcon16-aero.png)
         skin/classic/aero/browser/feeds/subscribe.css                (feeds/subscribe.css)
         skin/classic/aero/browser/feeds/subscribe-ui.css             (feeds/subscribe-ui.css)
index 006a3f10f29ab757ab9be2c52eac6298d2b485ef..2e9a206347873920ddd70fac6c74b9786fc1c6cd
GIT binary patch
literal 1779
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
V<;Y<h_VWM$002ovPDHLkV1imlQndg8
index aaae5b861d3a234efb46c86a3619b64f58059e2e..fbca0523df169b6892d2b5050035152fb6b92606
GIT binary patch
literal 1642
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
index e070eb424b03f8bedf69aaeab810f398cc3b28ec..1017be9032a298c8aa1f4a5cd4576087d8bb6f0d
GIT binary patch
literal 1945
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fc8b0be983652ea7a0bd19553b894aadc23fda6b
GIT binary patch
literal 480
zc$@*?0U!Q}P)<h;3K|Lk000e1NJLTq001EX000gM1^@s6p&oUN0004}Nkl<Zc-rmM
z%}N4M6bJCkC`8hT%1DT!fmZVX?rYt;N9YZFfXEg_K@r(DDkut~qOcE5YZSi{Q%iF+
zOCc!=GO8ir^q)W(N=I82)Z)iw?i}u%x%Zq~LqtFBKZ)O!#QgHQVQFnEzjJU*yLQ(X
z+xthfxVkAIj%BQm2FL@+5P;RqUK$_|BtrmJ%tW($$SwFzV|1QKQ#6?=5}!T6DDByu
zX2hwXrpIz`0+L}Y{Go1!Hv!2o7LVgG_tb0UyuA3)WahT$j8Bv8*c*Cz6}k%xcWq?r
zAqZ3g2g*Wh>r|{Bf<Ps3pp@1`Z6wMMy8Pj{_|?rv0^;cOho7VI%K^MsNYAiy<(dTn
zNFoQ!=ksovjIba8N#uYjRhViU=P?H&JQB##N%(>sF5fujRi%naKOZ*&Neq=Myymf>
z5lCXFY<Gy;ZawmZ{Gk{fINTo0b(CAUeJ-p74hSrA)!#JgQvwGBmP#$E5VwEBV#_8{
z>HbQs)ixbqAO-qLv6>M#11Zo~b5E%5?jQOvHdNE&EfZd?I98)^*s1-_WmWg*Zp?S&
W?K3g#I)Y;W0000<MNUMnLSTXx!PWEt
index 0ee9f505fb6bdb93e7808d7981c6e7dab048314b..e6fd29f7d3866263660d1f7e537ae96a4858a051
GIT binary patch
literal 745
zc%17D@N?(olHy`uVBq!ia0vp^20$#p!3HD)*8SPYz`(S@)5S5Q;?~uxzS+WoB5VnY
z0VfWvTDth)sSH#5#R@D;v8=zOcg@YMb12RD`)0fD+G{~tT3U4vloV2~wl4bEJaOW|
zD=!aqyBY>fkCeTy{eJE}O~u4%u{L|Z@A*Dwg0r}#l2ZGv|MsW9$MraJFA@J1`i5Wg
z+W$T<d+9TO-S<%8Aa0#pyKn_bjo;ic6<^&OQx*V4YJ(LdS6pH0miAZG{>?pS{oiS8
z-u#^0eS1=9R^!jF>Q3UNcR7E1ExUg1{N6vBS4!pHt6t82e(q5C!gZf3^f&77J#goi
zGGp7_h50gdH*eldw`Zw3x4B#<=yUVui4Ny0zx6Rc-+AE7+xA5_d(Zq%U~>A_vZnow
z-S>~>7b9+0%KJE+m^Yy`tFGW%cgC8xd-&B9Qv6TM`W*A%*{Rx#60>ypc_%c_c<%dt
zCcE{bjb@Q@QVQ&b{?FK#*>@kil~S3}AalfKzD_}HWv~g~>@(^2S_BIm8YkpewVQ2s
zP0lr%Un%T%fRWYd<evk*4kp*sKF>5yWRVF_c%sf7vv;eaRJ*U3v3?^nWA;&Fv%SmT
zyMe4YvxkL`WsT_hlz&II_9F{eL?&b<#%73YJ$dU)o8kjors?0ez0_UP=CnBMTACRT
z<9op!d(=N4U%y9OYU?Jm&50Zp{Rf`zovUMDxqTaVQlTQ-#(PQ{4l_&l{P&i6(-aZY
z;kafy2UkGa+%xjCtF|Ml`1-H@!2G?zZE75q0b5_$YB;fqY<~5R|Kf5Z6UP(Ht3uy9
z3TiEwq5Apn<oweYSQPnJh3#c`UD1#fX3AYsQkiDTUOIs<Yr^Yai;cf4g4q{J_ua3b
z+-&8+ZhB%S>#kiUdmkMX+fq?=t=hlYn3sRsf}_Tl{{;Tu${u~;(ac%TpMLnoe){dd
V^yd#$U4coM!PC{xWt~$(69CWeSx^7~
--- a/build/macosx/universal/unify
+++ b/build/macosx/universal/unify
@@ -1055,24 +1055,34 @@ sub makeUniversalInternal($$$$) {
       return complain(1, 'makeUniversal: symlink: '.$!.' for:',
                       $aLink,
                       $fileTargetPath);
     }
 
     return 1;
   }
   elsif($aSourceFile->lIsRegularFile()) {
-    my ($machPPC, $machX86);
+    my ($machPPC, $machX86, $fileName);
     if (!defined($filePPC) || !defined($fileX86)) {
       # One of the source files isn't present.  The right thing to do is
       # to just copy what does exist straight over, so skip Mach-O checks.
       $machPPC = 0;
       $machX86 = 0;
+      if (defined($filePPC)) {
+        $fileName = $filePPC;
+      } elsif (defined($fileX86)) {
+        $fileName = $fileX86;
+      } else {
+        complain(1, "The file must exist in at least one directory");
+        exit(1);
+      }
     }
     else {
+      # both files exist, pick the name of one.
+      $fileName = $fileX86;
       if (!defined($machPPC=$filePPC->isMachO())) {
         return complain(1, 'makeUniversal: isFileMachO ppc failed for:',
                         $filePPC->path());
       }
       if (!defined($machX86=$fileX86->isMachO())) {
         return complain(1, 'makeUniversal: isFileMachO x86 failed for:',
                         $fileX86->path());
       }
@@ -1084,17 +1094,17 @@ sub makeUniversalInternal($$$$) {
                   $fileX86->path());
     }
 
     if ($machPPC) {
       # makeUniversalFile will print an error if it fails.
       return makeUniversalFile($filePPC, $fileX86, $fileTargetPath);
     }
 
-    if (grep { $filePPC->path() =~ m/$_/; } @gSortMatches) {
+    if (grep { $fileName->path() =~ m/$_/; } @gSortMatches) {
       # Regular files, but should be compared with sorting first.
       # copyIfIdenticalWhenSorted will print an error if it fails.
       return copyIfIdenticalWhenSorted($filePPC, $fileX86, $fileTargetPath);
     }
 
     # Regular file.  copyIfIdentical will print an error if it fails.
     return copyIfIdentical($filePPC, $fileX86, $fileTargetPath);
   }
--- a/config/system-headers
+++ b/config/system-headers
@@ -35,17 +35,16 @@ app/Message.h
 app/MessageRunner.h
 arpa/inet.h
 arpa/nameser.h
 asm/sigcontext.h
 asm/signal.h
 ASRegistry.h
 assert.h
 atk/atk.h
-atlbase.h
 atlcom.h
 atlconv.h
 atlctl.cpp
 atlctl.h
 ATLCTL.H
 atlhost.h
 atlimpl.cpp
 atlwin.cpp
--- a/configure.in
+++ b/configure.in
@@ -2311,23 +2311,16 @@ ia64*-hpux*)
         fi
         ;;
     esac
 
     case "$host_os" in
     cygwin*|msvc*|mks*)
         AC_MSG_ERROR([Using a Cygwin build environment is unsupported. Configure cannot check for presence of necessary headers. Please upgrade to MozillaBuild; see https://developer.mozilla.org/en/Windows_Build_Prerequisites.])
         ;;
-    *)
-        AC_CHECK_HEADERS(oleacc.idl)
-        AC_LANG_SAVE
-        AC_LANG_CPLUSPLUS
-        MOZ_CHECK_HEADERS(atlbase.h)
-        AC_LANG_RESTORE
-        ;;
     esac
 
     case "$target" in
     i*86-*)
         if test "$HAVE_64BIT_OS"; then
             AC_MSG_ERROR([You are targeting i386 but using the 64-bit compiler.])
         fi
 
@@ -5249,29 +5242,16 @@ dnl ====================================
 MOZ_ARG_DISABLE_BOOL(accessibility,
 [  --disable-accessibility Disable accessibility support (off by default on OS X)],
     ACCESSIBILITY=,
     ACCESSIBILITY=1 )
 if test "$ACCESSIBILITY"; then
     AC_DEFINE(ACCESSIBILITY)
 fi
 
-if test -n "$ACCESSIBILITY" -a "$COMPILE_ENVIRONMENT" = "1"; then
-case "$target" in
-*-mingw*)
-    if test "$ac_cv_header_atlbase_h" = "no"; then
-        AC_MSG_ERROR([System header atlbase.h is not available. See http://developer.mozilla.org/en/docs/atlbase.h for details on fixing this problem.])
-    fi
-    if test "$ac_cv_header_oleacc_idl" = "no"; then
-        AC_MSG_ERROR([System header oleacc.idl is not available. See http://developer.mozilla.org/en/docs/oleacc.idl for details on fixing this problem.])
-    fi
-    ;;
-esac
-fi
-
 dnl ========================================================
 dnl Disable printing
 dnl ========================================================
 MOZ_ARG_DISABLE_BOOL(printing,
 [  --disable-printing      Disable printing support],
     NS_PRINTING=,
     NS_PRINTING=1)
 
new file mode 100644
--- /dev/null
+++ b/content/base/crashtests/682463.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+
+function boom()
+{
+  var j = document.createTextNode("j");
+  var r = document.createRange();
+  r.setEnd(j, 1);
+  j.splitText(0);
+  r.setEnd(j, 0);
+}
+
+</script>
+</head>
+
+<body onload="boom();"></body>
+
+</html>
\ No newline at end of file
--- a/content/base/crashtests/crashtests.list
+++ b/content/base/crashtests/crashtests.list
@@ -90,8 +90,9 @@ load 628599-1.html
 load 637214-1.svg
 load 637214-2.svg
 load 642022-1.html
 load 646184.html
 load 658845-1.svg
 load 667336-1.html
 load 679459.html
 load 679689-1.html
+load 682463.html
--- a/content/base/src/nsGkAtomList.h
+++ b/content/base/src/nsGkAtomList.h
@@ -1897,16 +1897,17 @@ GK_ATOM(_moz_mac_lion_theme, "-moz-mac-l
 GK_ATOM(_moz_windows_compositor, "-moz-windows-compositor")
 GK_ATOM(_moz_windows_classic, "-moz-windows-classic")
 GK_ATOM(_moz_windows_theme, "-moz-windows-theme")
 GK_ATOM(_moz_touch_enabled, "-moz-touch-enabled")
 GK_ATOM(_moz_maemo_classic, "-moz-maemo-classic")
 GK_ATOM(_moz_menubar_drag, "-moz-menubar-drag")
 GK_ATOM(_moz_device_pixel_ratio, "-moz-device-pixel-ratio")
 GK_ATOM(_moz_device_orientation, "-moz-device-orientation")
+GK_ATOM(_moz_is_resource_document, "-moz-is-resource-document")
 
 #ifdef ACCESSIBILITY
 GK_ATOM(anonid, "anonid")
 GK_ATOM(aria_activedescendant, "aria-activedescendant")
 GK_ATOM(aria_atomic, "aria-atomic")
 GK_ATOM(aria_autocomplete, "aria-autocomplete")
 GK_ATOM(aria_busy, "aria-busy")
 GK_ATOM(aria_checked, "aria-checked")
--- a/content/base/src/nsRange.cpp
+++ b/content/base/src/nsRange.cpp
@@ -266,72 +266,106 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 void
 nsRange::CharacterDataChanged(nsIDocument* aDocument,
                               nsIContent* aContent,
                               CharacterDataChangeInfo* aInfo)
 {
   NS_ASSERTION(mIsPositioned, "shouldn't be notified if not positioned");
 
+  nsINode* newRoot = nsnull;
+  nsINode* newStartNode = nsnull;
+  nsINode* newEndNode = nsnull;
+  PRUint32 newStartOffset = 0;
+  PRUint32 newEndOffset = 0;
+
   // If the changed node contains our start boundary and the change starts
   // before the boundary we'll need to adjust the offset.
   if (aContent == mStartParent &&
       aInfo->mChangeStart < static_cast<PRUint32>(mStartOffset)) {
     if (aInfo->mDetails) {
       // splitText(), aInfo->mDetails->mNextSibling is the new text node
       NS_ASSERTION(aInfo->mDetails->mType ==
                    CharacterDataChangeInfo::Details::eSplit,
                    "only a split can start before the end");
       NS_ASSERTION(static_cast<PRUint32>(mStartOffset) <= aInfo->mChangeEnd,
                    "mStartOffset is beyond the end of this node");
-      mStartOffset = static_cast<PRUint32>(mStartOffset) - aInfo->mChangeStart;
-      mStartParent = aInfo->mDetails->mNextSibling;
+      newStartOffset = static_cast<PRUint32>(mStartOffset) - aInfo->mChangeStart;
+      newStartNode = aInfo->mDetails->mNextSibling;
+      if (NS_UNLIKELY(aContent == mRoot)) {
+        newRoot = IsValidBoundary(newStartNode);
+      }
     } else {
       // If boundary is inside changed text, position it before change
       // else adjust start offset for the change in length.
       mStartOffset = static_cast<PRUint32>(mStartOffset) <= aInfo->mChangeEnd ?
         aInfo->mChangeStart :
         mStartOffset + aInfo->mChangeStart - aInfo->mChangeEnd +
           aInfo->mReplaceLength;
     }
   }
 
-  // Do the same thing for the end boundary.
-  if (aContent == mEndParent && aInfo->mChangeStart < static_cast<PRUint32>(mEndOffset)) {
-    if (aInfo->mDetails) {
+  // Do the same thing for the end boundary, except for splitText of a node
+  // with no parent then only switch to the new node if the start boundary
+  // did so too (otherwise the range would end up with disconnected nodes).
+  if (aContent == mEndParent &&
+      aInfo->mChangeStart < static_cast<PRUint32>(mEndOffset)) {
+    if (aInfo->mDetails && (aContent->GetParent() || newStartNode)) {
       // splitText(), aInfo->mDetails->mNextSibling is the new text node
       NS_ASSERTION(aInfo->mDetails->mType ==
                    CharacterDataChangeInfo::Details::eSplit,
                    "only a split can start before the end");
       NS_ASSERTION(static_cast<PRUint32>(mEndOffset) <= aInfo->mChangeEnd,
                    "mEndOffset is beyond the end of this node");
-      mEndOffset = static_cast<PRUint32>(mEndOffset) - aInfo->mChangeStart;
-      mEndParent = aInfo->mDetails->mNextSibling;
+      newEndOffset = static_cast<PRUint32>(mEndOffset) - aInfo->mChangeStart;
+      newEndNode = aInfo->mDetails->mNextSibling;
     } else {
       mEndOffset = static_cast<PRUint32>(mEndOffset) <= aInfo->mChangeEnd ?
         aInfo->mChangeStart :
         mEndOffset + aInfo->mChangeStart - aInfo->mChangeEnd +
           aInfo->mReplaceLength;
     }
   }
 
   if (aInfo->mDetails &&
       aInfo->mDetails->mType == CharacterDataChangeInfo::Details::eMerge) {
     // normalize(), aInfo->mDetails->mNextSibling is the merged text node
     // that will be removed
     nsIContent* removed = aInfo->mDetails->mNextSibling;
     if (removed == mStartParent) {
-      mStartOffset = static_cast<PRUint32>(mStartOffset) + aInfo->mChangeStart;
-      mStartParent = aContent;
+      newStartOffset = static_cast<PRUint32>(mStartOffset) + aInfo->mChangeStart;
+      newStartNode = aContent;
+      if (NS_UNLIKELY(removed == mRoot)) {
+        newRoot = IsValidBoundary(newStartNode);
+      }
     }
     if (removed == mEndParent) {
-      mEndOffset = static_cast<PRUint32>(mEndOffset) + aInfo->mChangeStart;
-      mEndParent = aContent;
+      newEndOffset = static_cast<PRUint32>(mEndOffset) + aInfo->mChangeStart;
+      newEndNode = aContent;
+      if (NS_UNLIKELY(removed == mRoot)) {
+        newRoot = IsValidBoundary(newEndNode);
+      }
     }
   }
+  if (newStartNode || newEndNode) {
+    if (!newStartNode) {
+      newStartNode = mStartParent;
+      newStartOffset = mStartOffset;
+    }
+    if (!newEndNode) {
+      newEndNode = mEndParent;
+      newEndOffset = mEndOffset;
+    }
+    DoSetRange(newStartNode, newStartOffset, newEndNode, newEndOffset,
+               newRoot ? newRoot : mRoot.get()
+#ifdef DEBUG
+               , !newEndNode->GetParent()
+#endif
+               );
+  }
 }
 
 void
 nsRange::ContentInserted(nsIDocument* aDocument,
                          nsIContent* aContainer,
                          nsIContent* aChild,
                          PRInt32 aIndexInContainer)
 {
@@ -468,22 +502,26 @@ static PRUint32 GetNodeLength(nsINode *a
 // It's important that all setting of the range start/end points 
 // go through this function, which will do all the right voodoo
 // for content notification of range ownership.  
 // Calling DoSetRange with either parent argument null will collapse
 // the range to have both endpoints point to the other node
 void
 nsRange::DoSetRange(nsINode* aStartN, PRInt32 aStartOffset,
                     nsINode* aEndN, PRInt32 aEndOffset,
-                    nsINode* aRoot)
+                    nsINode* aRoot
+#ifdef DEBUG
+                    , bool aNotInsertedYet
+#endif
+                    )
 {
   NS_PRECONDITION((aStartN && aEndN && aRoot) ||
                   (!aStartN && !aEndN && !aRoot),
                   "Set all or none");
-  NS_PRECONDITION(!aRoot ||
+  NS_PRECONDITION(!aRoot || aNotInsertedYet ||
                   (nsContentUtils::ContentIsDescendantOf(aStartN, aRoot) &&
                    nsContentUtils::ContentIsDescendantOf(aEndN, aRoot) &&
                    aRoot == IsValidBoundary(aStartN) &&
                    aRoot == IsValidBoundary(aEndN)),
                   "Wrong root");
   NS_PRECONDITION(!aRoot ||
                   (aStartN->IsNodeOfType(nsINode::eCONTENT) &&
                    aEndN->IsNodeOfType(nsINode::eCONTENT) &&
--- a/content/base/src/nsRange.h
+++ b/content/base/src/nsRange.h
@@ -144,17 +144,23 @@ public:
                                      PRBool *outNodeAfter);
   static nsresult CompareNodeToRange(nsINode* aNode, nsIRange* aRange,
                                      PRBool *outNodeBefore,
                                      PRBool *outNodeAfter);
 
 protected:
   void DoSetRange(nsINode* aStartN, PRInt32 aStartOffset,
                   nsINode* aEndN, PRInt32 aEndOffset,
-                  nsINode* aRoot);
+                  nsINode* aRoot
+#ifdef DEBUG
+                  // CharacterDataChanged use this to disable an assertion since
+                  // the new text node of a splitText hasn't been inserted yet.
+                  , bool aNotInsertedYet = false
+#endif
+                  );
 };
 
 // Make a new nsIDOMRange object
 nsresult NS_NewRange(nsIDOMRange** aInstancePtrResult);
 
 // Make a new nsIRangeUtils object
 nsresult NS_NewRangeUtils(nsIRangeUtils** aInstancePtrResult);
 
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -413,28 +413,30 @@ NS_IMPL_ADDREF_INHERITED(nsXMLHttpReques
 NS_IMPL_RELEASE_INHERITED(nsXMLHttpRequestUpload, nsXHREventTarget)
 
 /////////////////////////////////////////////
 //
 //
 /////////////////////////////////////////////
 
 nsXMLHttpRequest::nsXMLHttpRequest()
-  : mResponseType(XML_HTTP_RESPONSE_TYPE_DEFAULT),
+  : mResponseBodyDecodedPos(0),
+    mResponseType(XML_HTTP_RESPONSE_TYPE_DEFAULT),
     mRequestObserver(nsnull), mState(XML_HTTP_REQUEST_UNSENT),
     mUploadTransferred(0), mUploadTotal(0), mUploadComplete(PR_TRUE),
+    mProgressSinceLastProgressEvent(PR_FALSE),
     mUploadProgress(0), mUploadProgressMax(0),
     mErrorLoad(PR_FALSE), mTimerIsActive(PR_FALSE),
     mProgressEventWasDelayed(PR_FALSE),
     mLoadLengthComputable(PR_FALSE), mLoadTotal(0),
     mFirstStartRequestSeen(PR_FALSE),
-    mResultArrayBuffer(nsnull),
-    mResultJSON(JSVAL_VOID)
+    mInLoadProgressEvent(PR_FALSE),
+    mResultJSON(JSVAL_VOID),
+    mResultArrayBuffer(nsnull)
 {
-  mResponseBodyUnicode.SetIsVoid(PR_TRUE);
   nsLayoutStatics::AddRef();
 }
 
 nsXMLHttpRequest::~nsXMLHttpRequest()
 {
   if (mListenerManager) {
     mListenerManager->Disconnect();
   }
@@ -550,16 +552,29 @@ nsXMLHttpRequest::Initialize(nsISupports
   nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aOwner);
   NS_ENSURE_STATE(sgo);
   mScriptContext = sgo->GetContext();
   NS_ENSURE_STATE(mScriptContext);
   return NS_OK; 
 }
 
 void
+nsXMLHttpRequest::ResetResponse()
+{
+  mResponseXML = nsnull;
+  mResponseBody.Truncate();
+  mResponseText.Truncate();
+  mResponseBlob = nsnull;
+  mResultArrayBuffer = nsnull;
+  mResultJSON = JSVAL_VOID;
+  mLoadTransferred = 0;
+  mResponseBodyDecodedPos = 0;
+}
+
+void
 nsXMLHttpRequest::SetRequestObserver(nsIRequestObserver* aObserver)
 {
   mRequestObserver = aObserver;
 }
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsXMLHttpRequest)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsXMLHttpRequest,
@@ -697,186 +712,190 @@ nsXMLHttpRequest::GetResponseXML(nsIDOMD
   return NS_OK;
 }
 
 /*
  * This piece copied from nsXMLDocument, we try to get the charset
  * from HTTP headers.
  */
 nsresult
-nsXMLHttpRequest::DetectCharset(nsACString& aCharset)
+nsXMLHttpRequest::DetectCharset()
 {
-  aCharset.Truncate();
-  nsresult rv;
-  nsCAutoString charsetVal;
-  nsCOMPtr<nsIChannel> channel(do_QueryInterface(mReadRequest));
+  mResponseCharset.Truncate();
+  mDecoder = nsnull;
+
+  if (mResponseType != XML_HTTP_RESPONSE_TYPE_DEFAULT &&
+      mResponseType != XML_HTTP_RESPONSE_TYPE_TEXT &&
+      mResponseType != XML_HTTP_RESPONSE_TYPE_JSON &&
+      mResponseType != XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT) {
+    return NS_OK;
+  }
+
+  nsCOMPtr<nsIChannel> channel = do_QueryInterface(mReadRequest);
   if (!channel) {
     channel = mChannel;
-    if (!channel) {
-      // There will be no mChannel when we got a necko error in
-      // OnStopRequest or if we were never sent.
-      return NS_ERROR_NOT_AVAILABLE;
+  }
+
+  nsCAutoString charsetVal;
+  nsresult rv = channel ? channel->GetContentCharset(charsetVal) :
+                NS_ERROR_FAILURE;
+  if (NS_SUCCEEDED(rv)) {
+    nsCOMPtr<nsICharsetAlias> calias =
+      do_GetService(NS_CHARSETALIAS_CONTRACTID, &rv);
+    if (NS_SUCCEEDED(rv) && calias) {
+      rv = calias->GetPreferred(charsetVal, mResponseCharset);
     }
   }
 
-  rv = channel->GetContentCharset(charsetVal);
-  if (NS_SUCCEEDED(rv)) {
-    nsCOMPtr<nsICharsetAlias> calias(do_GetService(NS_CHARSETALIAS_CONTRACTID,&rv));
-    if(NS_SUCCEEDED(rv) && calias) {
-      rv = calias->GetPreferred(charsetVal, aCharset);
-    }
+  if (NS_FAILED(rv) || mResponseCharset.IsEmpty()) {
+    // MS documentation states UTF-8 is default for responseText
+    mResponseCharset.AssignLiteral("UTF-8");
   }
-  return rv;
+
+  nsCOMPtr<nsICharsetConverterManager> ccm =
+    do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  return ccm->GetUnicodeDecoderRaw(mResponseCharset.get(),
+                                   getter_AddRefs(mDecoder));
 }
 
 nsresult
-nsXMLHttpRequest::ConvertBodyToText(nsAString& aOutBuffer)
+nsXMLHttpRequest::AppendToResponseText(const char * aSrcBuffer,
+                                       PRUint32 aSrcBufferLen)
 {
+  NS_ENSURE_STATE(mDecoder);
+
+  PRInt32 destBufferLen;
+  nsresult rv = mDecoder->GetMaxLength(aSrcBuffer, aSrcBufferLen,
+                                       &destBufferLen);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  if (!mResponseText.SetCapacity(mResponseText.Length() + destBufferLen)) {
+    return NS_ERROR_OUT_OF_MEMORY;
+  }
+
+  PRUnichar* destBuffer = mResponseText.BeginWriting() + mResponseText.Length();
+
+  PRInt32 totalChars = mResponseText.Length();
+
   // This code here is basically a copy of a similar thing in
   // nsScanner::Append(const char* aBuffer, PRUint32 aLen).
   // If we get illegal characters in the input we replace
   // them and don't just fail.
-  if (!mResponseBodyUnicode.IsVoid()) {
-    aOutBuffer = mResponseBodyUnicode;
-    return NS_OK;
-  }
-  
-  PRInt32 dataLen = mResponseBody.Length();
-  if (!dataLen) {
-    mResponseBodyUnicode.SetIsVoid(PR_FALSE);
-    return NS_OK;
-  }
-
-  nsresult rv = NS_OK;
-
-  nsCAutoString dataCharset;
-  nsCOMPtr<nsIDocument> document(do_QueryInterface(mResponseXML));
-  if (document) {
-    dataCharset = document->GetDocumentCharacterSet();
-  } else {
-    if (NS_FAILED(DetectCharset(dataCharset)) || dataCharset.IsEmpty()) {
-      // MS documentation states UTF-8 is default for responseText
-      dataCharset.AssignLiteral("UTF-8");
-    }
-  }
-
-  // XXXbz is the charset ever "ASCII" as opposed to "us-ascii"?
-  if (dataCharset.EqualsLiteral("ASCII")) {
-    CopyASCIItoUTF16(mResponseBody, mResponseBodyUnicode);
-    aOutBuffer = mResponseBodyUnicode;
-    return NS_OK;
-  }
-
-  // can't fast-path UTF-8 using CopyUTF8toUTF16, since above we assumed UTF-8
-  // by default and CopyUTF8toUTF16 will stop if it encounters bytes that aren't
-  // valid UTF-8.  So we have to do the whole unicode decoder thing.
-
-  nsCOMPtr<nsICharsetConverterManager> ccm =
-    do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
-  if (NS_FAILED(rv))
-    return rv;
-
-  nsCOMPtr<nsIUnicodeDecoder> decoder;
-  rv = ccm->GetUnicodeDecoderRaw(dataCharset.get(),
-                                 getter_AddRefs(decoder));
-  if (NS_FAILED(rv))
-    return rv;
-
-  const char * inBuffer = mResponseBody.get();
-  PRInt32 outBufferLength;
-  rv = decoder->GetMaxLength(inBuffer, dataLen, &outBufferLength);
-  if (NS_FAILED(rv))
-    return rv;
-
-  nsStringBuffer* buf =
-    nsStringBuffer::Alloc((outBufferLength + 1) * sizeof(PRUnichar));
-  if (!buf) {
-    return NS_ERROR_OUT_OF_MEMORY;
-  }
-
-  PRUnichar* outBuffer = static_cast<PRUnichar*>(buf->Data());
-
-  PRInt32 totalChars = 0,
-          outBufferIndex = 0,
-          outLen = outBufferLength;
-
   do {
-    PRInt32 inBufferLength = dataLen;
-    rv = decoder->Convert(inBuffer,
-                          &inBufferLength,
-                          &outBuffer[outBufferIndex],
-                          &outLen);
-    totalChars += outLen;
+    PRInt32 srclen = (PRInt32)aSrcBufferLen;
+    PRInt32 destlen = (PRInt32)destBufferLen;
+    rv = mDecoder->Convert(aSrcBuffer,
+                           &srclen,
+                           destBuffer,
+                           &destlen);
     if (NS_FAILED(rv)) {
       // We consume one byte, replace it with U+FFFD
       // and try the conversion again.
-      outBuffer[outBufferIndex + outLen++] = (PRUnichar)0xFFFD;
-      outBufferIndex += outLen;
-      outLen = outBufferLength - (++totalChars);
-
-      decoder->Reset();
-
-      if((inBufferLength + 1) > dataLen) {
-        inBufferLength = dataLen;
-      } else {
-        inBufferLength++;
+
+      destBuffer[destlen] = (PRUnichar)0xFFFD; // add replacement character
+      destlen++; // skip written replacement character
+      destBuffer += destlen;
+      destBufferLen -= destlen;
+
+      if (srclen < (PRInt32)aSrcBufferLen) {
+        srclen++; // Consume the invalid character
       }
-
-      inBuffer = &inBuffer[inBufferLength];
-      dataLen -= inBufferLength;
+      aSrcBuffer += srclen;
+      aSrcBufferLen -= srclen;
+
+      mDecoder->Reset();
     }
-  } while ( NS_FAILED(rv) && (dataLen > 0) );
-
-  // Use the string buffer if it is small, or doesn't contain
-  // too much extra data.
-  if (outBufferLength < 127 ||
-      (outBufferLength * 0.9) < totalChars) {
-    outBuffer[totalChars] = PRUnichar(0);
-    // Move ownership to mResponseBodyUnicode.
-    buf->ToString(totalChars, mResponseBodyUnicode, PR_TRUE);
-  } else {
-    mResponseBodyUnicode.Assign(outBuffer, totalChars);
-    buf->Release();
-  }
-  aOutBuffer = mResponseBodyUnicode;
+
+    totalChars += destlen;
+
+  } while (NS_FAILED(rv) && aSrcBufferLen > 0);
+
+  mResponseText.SetLength(totalChars);
+
   return NS_OK;
 }
 
 /* readonly attribute AString responseText; */
 NS_IMETHODIMP nsXMLHttpRequest::GetResponseText(nsAString& aResponseText)
 {
-  nsresult rv = NS_OK;
-
   aResponseText.Truncate();
 
   if (mResponseType != XML_HTTP_RESPONSE_TYPE_DEFAULT &&
-      mResponseType != XML_HTTP_RESPONSE_TYPE_TEXT) {
+      mResponseType != XML_HTTP_RESPONSE_TYPE_TEXT &&
+      mResponseType != XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT) {
     return NS_ERROR_DOM_INVALID_STATE_ERR;
   }
 
-  if (mState & (XML_HTTP_REQUEST_DONE |
-                XML_HTTP_REQUEST_LOADING)) {
-    rv = ConvertBodyToText(aResponseText);
+  if (mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT &&
+      !mInLoadProgressEvent) {
+    aResponseText.SetIsVoid(PR_TRUE);
+    return NS_OK;
+  }
+
+  if (!(mState & (XML_HTTP_REQUEST_DONE | XML_HTTP_REQUEST_LOADING))) {
+    return NS_OK;
+  }
+
+  // We only decode text lazily if we're also parsing to a doc.
+  // Also, if we've decoded all current data already, then no need to decode
+  // more.
+  if (!mResponseXML ||
+      mResponseBodyDecodedPos == mResponseBody.Length()) {
+    aResponseText = mResponseText;
+    return NS_OK;
   }
 
-  return rv;
+  nsresult rv;
+
+  nsCOMPtr<nsIDocument> document = do_QueryInterface(mResponseXML);
+  if (mResponseCharset != document->GetDocumentCharacterSet()) {
+    mResponseCharset == document->GetDocumentCharacterSet();
+    mResponseText.Truncate();
+    mResponseBodyDecodedPos = 0;
+
+    nsCOMPtr<nsICharsetConverterManager> ccm =
+      do_GetService(NS_CHARSETCONVERTERMANAGER_CONTRACTID, &rv);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    rv = ccm->GetUnicodeDecoderRaw(mResponseCharset.get(),
+                                   getter_AddRefs(mDecoder));
+    NS_ENSURE_SUCCESS(rv, rv);
+  }
+
+  NS_ASSERTION(mResponseBodyDecodedPos < mResponseBody.Length(),
+               "Unexpected mResponseBodyDecodedPos");
+  rv = AppendToResponseText(mResponseBody.get() + mResponseBodyDecodedPos,
+                            mResponseBody.Length() - mResponseBodyDecodedPos);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  mResponseBodyDecodedPos = mResponseBody.Length();
+  
+  if (mState & XML_HTTP_REQUEST_DONE) {
+    // Free memory buffer which we no longer need
+    mResponseBody.Truncate();
+    mResponseBodyDecodedPos = 0;
+  }
+
+  aResponseText = mResponseText;
+
+  return NS_OK;
 }
 
 nsresult
 nsXMLHttpRequest::CreateResponseParsedJSON(JSContext* aCx)
 {
   if (!aCx) {
     return NS_ERROR_FAILURE;
   }
 
-  nsString bodyString;
-  ConvertBodyToText(bodyString);
   if (!JS_ParseJSON(aCx,
-                    (jschar*)PromiseFlatString(bodyString).get(),
-                    bodyString.Length(), &mResultJSON)) {
+                    (jschar*)mResponseText.get(),
+                    mResponseText.Length(), &mResultJSON)) {
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
 }
 
 nsresult
 nsXMLHttpRequest::CreateResponseArrayBuffer(JSContext *aCx)
@@ -918,16 +937,22 @@ NS_IMETHODIMP nsXMLHttpRequest::GetRespo
     aResponseType.AssignLiteral("document");
     break;
   case XML_HTTP_RESPONSE_TYPE_TEXT:
     aResponseType.AssignLiteral("text");
     break;
   case XML_HTTP_RESPONSE_TYPE_JSON:
     aResponseType.AssignLiteral("moz-json");
     break;
+  case XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT:
+    aResponseType.AssignLiteral("moz-chunked-text");
+    break;
+  case XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER:
+    aResponseType.AssignLiteral("moz-chunked-arraybuffer");
+    break;
   default:
     NS_ERROR("Should not happen");
   }
 
   return NS_OK;
 }
 
 /* attribute AString responseType; */
@@ -947,16 +972,26 @@ NS_IMETHODIMP nsXMLHttpRequest::SetRespo
   } else if (aResponseType.EqualsLiteral("blob")) {
     mResponseType = XML_HTTP_RESPONSE_TYPE_BLOB;
   } else if (aResponseType.EqualsLiteral("document")) {
     mResponseType = XML_HTTP_RESPONSE_TYPE_DOCUMENT;
   } else if (aResponseType.EqualsLiteral("text")) {
     mResponseType = XML_HTTP_RESPONSE_TYPE_TEXT;
   } else if (aResponseType.EqualsLiteral("moz-json")) {
     mResponseType = XML_HTTP_RESPONSE_TYPE_JSON;
+  } else if (aResponseType.EqualsLiteral("moz-chunked-text")) {
+    if (!(mState & XML_HTTP_REQUEST_ASYNC)) {
+      return NS_ERROR_DOM_INVALID_STATE_ERR;
+    }
+    mResponseType = XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT;
+  } else if (aResponseType.EqualsLiteral("moz-chunked-arraybuffer")) {
+    if (!(mState & XML_HTTP_REQUEST_ASYNC)) {
+      return NS_ERROR_DOM_INVALID_STATE_ERR;
+    }
+    mResponseType = XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER;
   }
   // If the given value is not the empty string, "arraybuffer",
   // "blob", "document", or "text" terminate these steps.
 
   // If the state is OPENED, SetCacheAsFile would have no effect here
   // because the channel hasn't initialized the cache entry yet.
   // SetCacheAsFile will be called from OnStartRequest.
   // If the state is HEADERS_RECEIVED, however, we need to call
@@ -974,30 +1009,39 @@ NS_IMETHODIMP nsXMLHttpRequest::SetRespo
 /* readonly attribute jsval response; */
 NS_IMETHODIMP nsXMLHttpRequest::GetResponse(JSContext *aCx, jsval *aResult)
 {
   nsresult rv = NS_OK;
 
   switch (mResponseType) {
   case XML_HTTP_RESPONSE_TYPE_DEFAULT:
   case XML_HTTP_RESPONSE_TYPE_TEXT:
+  case XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT:
     {
       nsString str;
       rv = GetResponseText(str);
       if (NS_FAILED(rv)) return rv;
-      nsStringBuffer* buf;
-      *aResult = XPCStringConvert::ReadableToJSVal(aCx, str, &buf);
-      if (buf) {
-        str.ForgetSharedBuffer();
+      if (str.IsVoid()) {
+        *aResult = JSVAL_NULL;
+      } else {
+        nsStringBuffer* buf;
+        *aResult = XPCStringConvert::ReadableToJSVal(aCx, str, &buf);
+        if (buf) {
+          str.ForgetSharedBuffer();
+        }
       }
     }
     break;
 
   case XML_HTTP_RESPONSE_TYPE_ARRAYBUFFER:
-    if (mState & XML_HTTP_REQUEST_DONE) {
+  case XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER:
+    if ((mResponseType == XML_HTTP_RESPONSE_TYPE_ARRAYBUFFER &&
+         mState & XML_HTTP_REQUEST_DONE) ||
+        (mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER &&
+         mInLoadProgressEvent)) {
       if (!mResultArrayBuffer) {
          rv = CreateResponseArrayBuffer(aCx);
          NS_ENSURE_SUCCESS(rv, rv);
       }
       *aResult = OBJECT_TO_JSVAL(mResultArrayBuffer);
     } else {
       *aResult = JSVAL_NULL;
     }
@@ -1024,18 +1068,17 @@ NS_IMETHODIMP nsXMLHttpRequest::GetRespo
     break;
 
   case XML_HTTP_RESPONSE_TYPE_JSON:
     if (mState & XML_HTTP_REQUEST_DONE) {
       if (mResultJSON == JSVAL_VOID) {
         rv = CreateResponseParsedJSON(aCx);
         NS_ENSURE_SUCCESS(rv, rv);
 
-        mResponseBody.Truncate();
-        mResponseBodyUnicode.SetIsVoid(PR_TRUE);
+        mResponseText.Truncate();
       }
       *aResult = mResultJSON;
     } else {
       *aResult = JSVAL_NULL;
     }
     break;
 
   default:
@@ -1120,24 +1163,19 @@ nsXMLHttpRequest::Abort()
     mReadRequest->Cancel(NS_BINDING_ABORTED);
   }
   if (mChannel) {
     mChannel->Cancel(NS_BINDING_ABORTED);
   }
   if (mCORSPreflightChannel) {
     mCORSPreflightChannel->Cancel(NS_BINDING_ABORTED);
   }
-  mResponseXML = nsnull;
   PRUint32 responseLength = mResponseBody.Length();
-  mResponseBody.Truncate();
-  mResponseBodyUnicode.SetIsVoid(PR_TRUE);
-  mResponseBlob = nsnull;
+  ResetResponse();
   mState |= XML_HTTP_REQUEST_ABORTED;
-  mResultArrayBuffer = nsnull;
-  mResultJSON = JSVAL_VOID;
   
   if (!(mState & (XML_HTTP_REQUEST_UNSENT |
                   XML_HTTP_REQUEST_OPENED |
                   XML_HTTP_REQUEST_DONE))) {
     ChangeState(XML_HTTP_REQUEST_DONE, PR_TRUE);
   }
 
   if (!(mState & XML_HTTP_REQUEST_SYNCLOOPING)) {
@@ -1322,17 +1360,19 @@ void
 nsXMLHttpRequest::DispatchProgressEvent(nsDOMEventTargetHelper* aTarget,
                                         const nsAString& aType,
                                         PRBool aUseLSEventWrapper,
                                         PRBool aLengthComputable,
                                         PRUint64 aLoaded, PRUint64 aTotal,
                                         PRUint64 aPosition, PRUint64 aTotalSize)
 {
   NS_ASSERTION(aTarget, "null target");
-  if (aType.IsEmpty() ||
+  NS_ASSERTION(!aType.IsEmpty(), "missing event type");
+
+  if (NS_FAILED(CheckInnerWindowCorrectness()) ||
       (!AllowUploadProgress() &&
        (aTarget == mUpload || aType.EqualsLiteral(UPLOADPROGRESS_STR)))) {
     return;
   }
 
   PRBool dispatchLoadend = aType.EqualsLiteral(LOAD_STR) ||
                            aType.EqualsLiteral(ERROR_STR) ||
                            aType.EqualsLiteral(ABORT_STR);
@@ -1586,29 +1626,38 @@ nsXMLHttpRequest::StreamReaderFunc(nsIIn
   nsXMLHttpRequest* xmlHttpRequest = static_cast<nsXMLHttpRequest*>(closure);
   if (!xmlHttpRequest || !writeCount) {
     NS_WARNING("XMLHttpRequest cannot read from stream: no closure or writeCount");
     return NS_ERROR_FAILURE;
   }
 
   if (xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_BLOB &&
       xmlHttpRequest->mResponseBlob) {
-    xmlHttpRequest->ChangeState(XML_HTTP_REQUEST_LOADING);
     *writeCount = count;
     return NS_OK;
   }
 
-  if (xmlHttpRequest->mResponseType != XML_HTTP_RESPONSE_TYPE_DOCUMENT) {
+  if ((xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_DEFAULT &&
+       xmlHttpRequest->mResponseXML) ||
+      xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_ARRAYBUFFER ||
+      xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_BLOB ||
+      xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER) {
     // Copy for our own use
     PRUint32 previousLength = xmlHttpRequest->mResponseBody.Length();
     xmlHttpRequest->mResponseBody.Append(fromRawSegment,count);
     if (count > 0 && xmlHttpRequest->mResponseBody.Length() == previousLength) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
-    xmlHttpRequest->mResponseBodyUnicode.SetIsVoid(PR_TRUE);
+  } else if (xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_DEFAULT ||
+             xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_TEXT ||
+             xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_JSON ||
+             xmlHttpRequest->mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT) {
+    NS_ASSERTION(!xmlHttpRequest->mResponseXML,
+                 "We shouldn't be parsing a doc here");
+    xmlHttpRequest->AppendToResponseText(fromRawSegment, count);
   }
 
   nsresult rv = NS_OK;
 
   if (xmlHttpRequest->mState & XML_HTTP_REQUEST_PARSEBODY) {
     // Give the same data to the parser.
 
     // We need to wrap the data in a new lightweight stream and pass that
@@ -1627,18 +1676,16 @@ nsXMLHttpRequest::StreamReaderFunc(nsIIn
       // No use to continue parsing if we failed here, but we
       // should still finish reading the stream
       if (NS_FAILED(parsingResult)) {
         xmlHttpRequest->mState &= ~XML_HTTP_REQUEST_PARSEBODY;
       }
     }
   }
 
-  xmlHttpRequest->ChangeState(XML_HTTP_REQUEST_LOADING);
-
   if (NS_SUCCEEDED(rv)) {
     *writeCount = count;
   } else {
     *writeCount = 0;
   }
 
   return rv;
 }
@@ -1661,34 +1708,48 @@ void nsXMLHttpRequest::CreateResponseBlo
     nsCOMPtr<nsISupports> cacheToken;
     if (cc) {
       cc->GetCacheToken(getter_AddRefs(cacheToken));
     }
 
     mResponseBlob =
       new nsDOMFileFile(file, NS_ConvertASCIItoUTF16(contentType), cacheToken);
     mResponseBody.Truncate();
-    mResponseBodyUnicode.SetIsVoid(PR_TRUE);
   }
 }
 
-/* void onDataAvailable (in nsIRequest request, in nsISupports ctxt, in nsIInputStream inStr, in unsigned long sourceOffset, in unsigned long count); */
 NS_IMETHODIMP
-nsXMLHttpRequest::OnDataAvailable(nsIRequest *request, nsISupports *ctxt, nsIInputStream *inStr, PRUint32 sourceOffset, PRUint32 count)
+nsXMLHttpRequest::OnDataAvailable(nsIRequest *request,
+                                  nsISupports *ctxt,
+                                  nsIInputStream *inStr,
+                                  PRUint32 sourceOffset,
+                                  PRUint32 count)
 {
   NS_ENSURE_ARG_POINTER(inStr);
 
   NS_ABORT_IF_FALSE(mContext.get() == ctxt,"start context different from OnDataAvailable context");
 
   if (mResponseType == XML_HTTP_RESPONSE_TYPE_BLOB && !mResponseBlob) {
     CreateResponseBlob(request);
   }
 
+  mProgressSinceLastProgressEvent = PR_TRUE;
+
   PRUint32 totalRead;
-  return inStr->ReadSegments(nsXMLHttpRequest::StreamReaderFunc, (void*)this, count, &totalRead);
+  nsresult rv = inStr->ReadSegments(nsXMLHttpRequest::StreamReaderFunc,
+                                    (void*)this, count, &totalRead);
+  NS_ENSURE_SUCCESS(rv, rv);
+
+  mLoadTransferred += totalRead;
+
+  ChangeState(XML_HTTP_REQUEST_LOADING);
+  
+  MaybeDispatchProgressEvents(PR_FALSE);
+
+  return NS_OK;
 }
 
 PRBool
 IsSameOrBaseChannel(nsIRequest* aPossibleBase, nsIChannel* aChannel)
 {
   nsCOMPtr<nsIMultiPartChannel> mpChannel = do_QueryInterface(aPossibleBase);
   if (mpChannel) {
     nsCOMPtr<nsIChannel> baseChannel;
@@ -1738,61 +1799,64 @@ nsXMLHttpRequest::OnStartRequest(nsIRequ
     documentPrincipal = do_CreateInstance("@mozilla.org/nullprincipal;1", &rv);
     NS_ENSURE_SUCCESS(rv, rv);
   } else {
     documentPrincipal = mPrincipal;
   }
 
   channel->SetOwner(documentPrincipal);
 
+  nsresult status;
+  request->GetStatus(&status);
+  mErrorLoad = mErrorLoad || NS_FAILED(status);
+
+  if (mUpload && !mUploadComplete && !mErrorLoad &&
+      (mState & XML_HTTP_REQUEST_ASYNC)) {
+    if (mTimerIsActive) {
+      mTimerIsActive = PR_FALSE;
+      mProgressNotifier->Cancel();
+    }
+    MaybeDispatchProgressEvents(PR_TRUE);
+    mUploadComplete = PR_TRUE;
+    DispatchProgressEvent(mUpload, NS_LITERAL_STRING(LOAD_STR),
+                          PR_TRUE, mUploadTotal, mUploadTotal);
+  }
+
   mReadRequest = request;
   mContext = ctxt;
   mState |= XML_HTTP_REQUEST_PARSEBODY;
   mState &= ~XML_HTTP_REQUEST_MPART_HEADERS;
   ChangeState(XML_HTTP_REQUEST_HEADERS_RECEIVED);
 
   if (mResponseType == XML_HTTP_RESPONSE_TYPE_BLOB) {
     nsCOMPtr<nsICachingChannel> cc(do_QueryInterface(mChannel));
     if (cc) {
       cc->SetCacheAsFile(PR_TRUE);
     }
   }
 
-  nsresult status;
-  request->GetStatus(&status);
-  mErrorLoad = mErrorLoad || NS_FAILED(status);
-
-  if (mUpload && !mUploadComplete && !mErrorLoad &&
-      (mState & XML_HTTP_REQUEST_ASYNC)) {
-    mUploadComplete = PR_TRUE;
-    DispatchProgressEvent(mUpload, NS_LITERAL_STRING(LOAD_STR),
-                          PR_TRUE, mUploadTotal, mUploadTotal);
+  ResetResponse();
+
+  if (!mOverrideMimeType.IsEmpty()) {
+    channel->SetContentType(mOverrideMimeType);
   }
 
-  // Reset responseBody
-  mResponseBody.Truncate();
-  mResponseBodyUnicode.SetIsVoid(PR_TRUE);
-  mResponseBlob = nsnull;
-  mResultArrayBuffer = nsnull;
+  DetectCharset();
 
   // Set up responseXML
   PRBool parseBody = mResponseType == XML_HTTP_RESPONSE_TYPE_DEFAULT ||
                      mResponseType == XML_HTTP_RESPONSE_TYPE_DOCUMENT;
   nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(mChannel));
   if (parseBody && httpChannel) {
     nsCAutoString method;
     httpChannel->GetRequestMethod(method);
     parseBody = !method.EqualsLiteral("HEAD");
   }
 
   if (parseBody && NS_SUCCEEDED(status)) {
-    if (!mOverrideMimeType.IsEmpty()) {
-      channel->SetContentType(mOverrideMimeType);
-    }
-
     // We can gain a huge performance win by not even trying to
     // parse non-XML data. This also protects us from the situation
     // where we have an XML document and sink, but HTML (or other)
     // parser, which can produce unreliable results.
     nsCAutoString type;
     channel->GetContentType(type);
 
     if (type.Find("xml") == kNotFound) {
@@ -1913,16 +1977,20 @@ nsXMLHttpRequest::OnStopRequest(nsIReque
     NS_ABORT_IF_FALSE(parser, "stream listener was expected to be a parser");
     mXMLParserStreamListener->OnStopRequest(request, ctxt, status);
   }
 
   mXMLParserStreamListener = nsnull;
   mReadRequest = nsnull;
   mContext = nsnull;
 
+  // If we're received data since the last progress event, make sure to fire
+  // an event for it.
+  MaybeDispatchProgressEvents(PR_TRUE);
+
   nsCOMPtr<nsIChannel> channel(do_QueryInterface(request));
   NS_ENSURE_TRUE(channel, NS_ERROR_UNEXPECTED);
 
   if (NS_SUCCEEDED(status) && mResponseType == XML_HTTP_RESPONSE_TYPE_BLOB) {
     if (!mResponseBlob) {
       CreateResponseBlob(request);
     }
     if (!mResponseBlob) {
@@ -1937,18 +2005,17 @@ nsXMLHttpRequest::OnStopRequest(nsIReque
       if (blobData) {
         memcpy(blobData, mResponseBody.BeginReading(), blobLen);
 
         mResponseBlob =
           new nsDOMMemoryFile(blobData, blobLen,
                               NS_ConvertASCIItoUTF16(contentType));
         mResponseBody.Truncate();
       }
-      NS_ASSERTION(mResponseBodyUnicode.IsVoid(),
-                   "mResponseBodyUnicode should be empty");
+      NS_ASSERTION(mResponseText.IsEmpty(), "mResponseText should be empty");
     }
   }
 
   channel->SetNotificationCallbacks(nsnull);
   mNotificationCallbacks = nsnull;
   mChannelEventSink = nsnull;
   mProgressEventSink = nsnull;
 
@@ -1982,24 +2049,23 @@ nsXMLHttpRequest::OnStopRequest(nsIReque
     mResponseXML->GetDocumentElement(getter_AddRefs(root));
     if (!root) {
       mResponseXML = nsnull;
     }
   }
 
   ChangeState(XML_HTTP_REQUEST_DONE, PR_TRUE);
 
-  PRUint32 responseLength = mResponseBody.Length();
   NS_NAMED_LITERAL_STRING(errorStr, ERROR_STR);
   NS_NAMED_LITERAL_STRING(loadStr, LOAD_STR);
   DispatchProgressEvent(this,
                         mErrorLoad ? errorStr : loadStr,
                         !mErrorLoad,
-                        responseLength,
-                        mErrorLoad ? 0 : responseLength);
+                        mLoadTransferred,
+                        mErrorLoad ? 0 : mLoadTransferred);
   if (mErrorLoad && mUpload && !mUploadComplete) {
     DispatchProgressEvent(mUpload, errorStr, PR_TRUE,
                           mUploadTransferred, mUploadTotal);
   }
 
   if (mErrorLoad) {
     // By nulling out channel here we make it so that Send() can test
     // for that and throw. Also calling the various status
@@ -2387,23 +2453,17 @@ nsXMLHttpRequest::Send(nsIVariant *aBody
       if (!contentType.LowerCaseEqualsLiteral("text/plain") &&
           !contentType.LowerCaseEqualsLiteral("application/x-www-form-urlencoded") &&
           !contentType.LowerCaseEqualsLiteral("multipart/form-data")) {
         mCORSUnsafeHeaders.AppendElement(NS_LITERAL_CSTRING("Content-Type"));
       }
     }
   }
 
-  // Reset responseBody
-  mResponseBody.Truncate();
-  mResponseBodyUnicode.SetIsVoid(PR_TRUE);
-  mResponseBlob = nsnull;
-
-  // Reset responseXML
-  mResponseXML = nsnull;
+  ResetResponse();
 
   rv = CheckChannelForCrossSiteRequest(mChannel);
   NS_ENSURE_SUCCESS(rv, rv);
 
   PRBool withCredentials = !!(mState & XML_HTTP_REQUEST_AC_WITH_CREDENTIALS);
 
   // Hook us up to listen to redirects and the like
   mChannel->GetNotificationCallbacks(getter_AddRefs(mNotificationCallbacks));
@@ -2919,67 +2979,111 @@ nsXMLHttpRequest::OnRedirectVerifyCallba
   mRedirectCallback->OnRedirectVerifyCallback(result);
   mRedirectCallback = nsnull;
 }
 
 /////////////////////////////////////////////////////
 // nsIProgressEventSink methods:
 //
 
+void
+nsXMLHttpRequest::MaybeDispatchProgressEvents(PRBool aFinalProgress)
+{
+  if (aFinalProgress && mTimerIsActive) {
+    mTimerIsActive = PR_FALSE;
+    mProgressNotifier->Cancel();
+  }
+
+  if (mTimerIsActive ||
+      !mProgressSinceLastProgressEvent ||
+      mErrorLoad ||
+      !(mState & XML_HTTP_REQUEST_ASYNC)) {
+    return;
+  }
+
+  if (!aFinalProgress) {
+    StartProgressEventTimer();
+  }
+
+  // We're uploading if our state is XML_HTTP_REQUEST_OPENED or
+  // XML_HTTP_REQUEST_SENT
+  if ((XML_HTTP_REQUEST_OPENED | XML_HTTP_REQUEST_SENT) & mState) {
+    if (aFinalProgress) {
+      mUploadTotal = mUploadTransferred;
+      mUploadProgressMax = mUploadProgress;
+      mUploadLengthComputable = PR_TRUE;
+    }
+    DispatchProgressEvent(this, NS_LITERAL_STRING(UPLOADPROGRESS_STR),
+                          PR_TRUE, mUploadLengthComputable, mUploadTransferred,
+                          mUploadTotal, mUploadProgress,
+                          mUploadProgressMax);
+    if (mUpload && !mUploadComplete) {
+      DispatchProgressEvent(mUpload, NS_LITERAL_STRING(PROGRESS_STR),
+                            PR_TRUE, mUploadLengthComputable, mUploadTransferred,
+                            mUploadTotal, mUploadProgress,
+                            mUploadProgressMax);
+    }
+  } else {
+    if (aFinalProgress) {
+      mLoadTotal = mLoadTransferred;
+      mLoadLengthComputable = PR_TRUE;
+    }
+    mInLoadProgressEvent = PR_TRUE;
+    DispatchProgressEvent(this, NS_LITERAL_STRING(PROGRESS_STR),
+                          PR_TRUE, mLoadLengthComputable, mLoadTransferred,
+                          mLoadTotal, mLoadTransferred, mLoadTotal);
+    mInLoadProgressEvent = PR_FALSE;
+    if (mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT ||
+        mResponseType == XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER) {
+      mResponseBody.Truncate();
+      mResponseText.Truncate();
+      mResultArrayBuffer = nsnull;
+    }
+  }
+
+  mProgressSinceLastProgressEvent = PR_FALSE;
+}
+
 NS_IMETHODIMP
 nsXMLHttpRequest::OnProgress(nsIRequest *aRequest, nsISupports *aContext, PRUint64 aProgress, PRUint64 aProgressMax)
 {
   // We're in middle of processing multipart headers and we don't want to report
   // any progress because upload's 'load' is dispatched when we start to load
   // the first response.
   if (XML_HTTP_REQUEST_MPART_HEADERS & mState) {
     return NS_OK;
   }
 
   // We're uploading if our state is XML_HTTP_REQUEST_OPENED or
   // XML_HTTP_REQUEST_SENT
   PRBool upload = !!((XML_HTTP_REQUEST_OPENED | XML_HTTP_REQUEST_SENT) & mState);
-  PRUint64 loaded = aProgress;
-  PRUint64 total = aProgressMax;
   // When uploading, OnProgress reports also headers in aProgress and aProgressMax.
   // So, try to remove the headers, if possible.
   PRBool lengthComputable = (aProgressMax != LL_MAXUINT);
   if (upload) {
-   if (lengthComputable) {
+    PRUint64 loaded = aProgress;
+    PRUint64 total = aProgressMax;
+    if (lengthComputable) {
       PRUint64 headerSize = aProgressMax - mUploadTotal;
       loaded -= headerSize;
       total -= headerSize;
     }
+    mUploadLengthComputable = lengthComputable;
     mUploadTransferred = loaded;
     mUploadProgress = aProgress;
     mUploadProgressMax = aProgressMax;
+    mProgressSinceLastProgressEvent = PR_TRUE;
+
+    MaybeDispatchProgressEvents(PR_FALSE);
   } else {
     mLoadLengthComputable = lengthComputable;
-    mLoadTotal = mLoadLengthComputable ? total : 0;
-  }
-
-  if (mTimerIsActive) {
-    // The progress event will be dispatched when the notifier calls Notify().
-    mProgressEventWasDelayed = PR_TRUE;
-    return NS_OK;
-  }
-
-  if (!mErrorLoad && (mState & XML_HTTP_REQUEST_ASYNC)) {
-    StartProgressEventTimer();
-    NS_NAMED_LITERAL_STRING(progress, PROGRESS_STR);
-    NS_NAMED_LITERAL_STRING(uploadprogress, UPLOADPROGRESS_STR);
-    DispatchProgressEvent(this, upload ? uploadprogress : progress, PR_TRUE,
-                          lengthComputable, loaded, lengthComputable ? total : 0,
-                          aProgress, aProgressMax);
-
-    if (upload && mUpload && !mUploadComplete) {
-      NS_WARN_IF_FALSE(mUploadTotal == total, "Wrong upload total?");
-      DispatchProgressEvent(mUpload, progress,  PR_TRUE, lengthComputable, loaded,
-                            lengthComputable ? total : 0, aProgress, aProgressMax);
-    }
+    mLoadTotal = lengthComputable ? aProgressMax : 0;
+    
+    // Don't dispatch progress events here. OnDataAvailable will take care
+    // of that.
   }
 
   if (mProgressEventSink) {
     mProgressEventSink->OnProgress(aRequest, aContext, aProgress,
                                    aProgressMax);
   }
 
   return NS_OK;
@@ -3085,45 +3189,20 @@ nsXMLHttpRequest::GetUpload(nsIXMLHttpRe
   NS_ADDREF(*aUpload = mUpload);
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsXMLHttpRequest::Notify(nsITimer* aTimer)
 {
   mTimerIsActive = PR_FALSE;
-  if (NS_SUCCEEDED(CheckInnerWindowCorrectness()) && !mErrorLoad &&
-      (mState & XML_HTTP_REQUEST_ASYNC)) {
-    if (mProgressEventWasDelayed) {
-      mProgressEventWasDelayed = PR_FALSE;
-      if (!(XML_HTTP_REQUEST_MPART_HEADERS & mState)) {
-        StartProgressEventTimer();
-        // We're uploading if our state is XML_HTTP_REQUEST_OPENED or
-        // XML_HTTP_REQUEST_SENT
-        if ((XML_HTTP_REQUEST_OPENED | XML_HTTP_REQUEST_SENT) & mState) {
-          DispatchProgressEvent(this, NS_LITERAL_STRING(UPLOADPROGRESS_STR),
-                                PR_TRUE, PR_TRUE, mUploadTransferred,
-                                mUploadTotal, mUploadProgress,
-                                mUploadProgressMax);
-          if (mUpload && !mUploadComplete) {
-            DispatchProgressEvent(mUpload, NS_LITERAL_STRING(PROGRESS_STR),
-                                  PR_TRUE, PR_TRUE, mUploadTransferred,
-                                  mUploadTotal, mUploadProgress,
-                                  mUploadProgressMax);
-          }
-        } else {
-          DispatchProgressEvent(this, NS_LITERAL_STRING(PROGRESS_STR),
-                                mLoadLengthComputable, mResponseBody.Length(),
-                                mLoadTotal);
-        }
-      }
-    }
-  } else if (mProgressNotifier) {
-    mProgressNotifier->Cancel();
+  if (!(XML_HTTP_REQUEST_MPART_HEADERS & mState)) {
+    MaybeDispatchProgressEvents(PR_FALSE);
   }
+
   return NS_OK;
 }
 
 void
 nsXMLHttpRequest::StartProgressEventTimer()
 {
   if (!mProgressNotifier) {
     mProgressNotifier = do_CreateInstance(NS_TIMER_CONTRACTID);
--- a/content/base/src/nsXMLHttpRequest.h
+++ b/content/base/src/nsXMLHttpRequest.h
@@ -63,16 +63,17 @@
 #include "nsITimer.h"
 #include "nsIPrivateDOMEvent.h"
 #include "nsDOMProgressEvent.h"
 #include "nsDOMEventTargetWrapperCache.h"
 #include "nsContentUtils.h"
 
 class nsILoadGroup;
 class AsyncVerifyRedirectCallbackForwarder;
+class nsIUnicodeDecoder;
 
 class nsXHREventTarget : public nsDOMEventTargetWrapperCache,
                          public nsIXMLHttpRequestEventTarget
 {
 public:
   virtual ~nsXHREventTarget() {}
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsXHREventTarget,
@@ -183,31 +184,36 @@ public:
                              PRBool aLengthComputable,
                              PRUint64 aLoaded, PRUint64 aTotal)
   {
     DispatchProgressEvent(aTarget, aType, PR_FALSE,
                           aLengthComputable, aLoaded, aTotal,
                           aLoaded, aLengthComputable ? aTotal : LL_MAXUINT);
   }
 
+  // Dispatch the "progress" event on the XHR or XHR.upload object if we've
+  // received data since the last "progress" event. Also dispatches
+  // "uploadprogress" as needed.
+  void MaybeDispatchProgressEvents(PRBool aFinalProgress);
+
   // This is called by the factory constructor.
   nsresult Init();
 
   void SetRequestObserver(nsIRequestObserver* aObserver);
 
   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsXMLHttpRequest,
                                            nsXHREventTarget)
   PRBool AllowUploadProgress();
   void RootResultArrayBuffer();
   
 protected:
   friend class nsMultipartProxyListener;
 
-  nsresult DetectCharset(nsACString& aCharset);
-  nsresult ConvertBodyToText(nsAString& aOutBuffer);
+  nsresult DetectCharset();
+  nsresult AppendToResponseText(const char * aBuffer, PRUint32 aBufferLen);
   static NS_METHOD StreamReaderFunc(nsIInputStream* in,
                 void* closure,
                 const char* fromRawSegment,
                 PRUint32 toOffset,
                 PRUint32 count,
                 PRUint32 *writeCount);
   nsresult CreateResponseParsedJSON(JSContext* aCx);
   nsresult CreateResponseArrayBuffer(JSContext* aCx);
@@ -263,33 +269,50 @@ protected:
     NS_DECL_NSIHTTPHEADERVISITOR
     nsHeaderVisitor() { }
     virtual ~nsHeaderVisitor() {}
     const nsACString &Headers() { return mHeaders; }
   private:
     nsCString mHeaders;
   };
 
-  // The bytes of our response body
+  // The bytes of our response body. Only used for DEFAULT, ARRAYBUFFER and
+  // BLOB responseTypes
   nsCString mResponseBody;
 
-  // The Unicode version of our response body.  This is just a cache; if the
-  // string is not void, we have a cached value.  This works because we only
-  // allow looking at this value once state is INTERACTIVE, and at that
-  // point our charset can only change due to more data coming in, which
-  // will cause us to clear the cached value anyway.
-  nsString mResponseBodyUnicode;
+  // The text version of our response body. This is incrementally decoded into
+  // as we receive network data. However for the DEFAULT responseType we
+  // lazily decode into this from mResponseBody only when .responseText is
+  // accessed.
+  // Only used for DEFAULT and TEXT responseTypes.
+  nsString mResponseText;
+  
+  // For DEFAULT responseType we use this to keep track of how far we've
+  // lazily decoded from mResponseBody to mResponseText
+  PRUint32 mResponseBodyDecodedPos;
+
+  // Decoder used for decoding into mResponseText
+  // Only used for DEFAULT, TEXT and JSON responseTypes.
+  // In cases where we've only received half a surrogate, the decoder itself
+  // carries the state to remember this. Next time we receive more data we
+  // simply feed the new data into the decoder which will handle the second
+  // part of the surrogate.
+  nsCOMPtr<nsIUnicodeDecoder> mDecoder;
+
+  nsCString mResponseCharset;
 
   enum {
     XML_HTTP_RESPONSE_TYPE_DEFAULT,
     XML_HTTP_RESPONSE_TYPE_ARRAYBUFFER,
     XML_HTTP_RESPONSE_TYPE_BLOB,
     XML_HTTP_RESPONSE_TYPE_DOCUMENT,
     XML_HTTP_RESPONSE_TYPE_TEXT,
-    XML_HTTP_RESPONSE_TYPE_JSON
+    XML_HTTP_RESPONSE_TYPE_JSON,
+    XML_HTTP_RESPONSE_TYPE_CHUNKED_TEXT,
+    XML_HTTP_RESPONSE_TYPE_CHUNKED_ARRAYBUFFER
   } mResponseType;
 
   nsCOMPtr<nsIDOMBlob> mResponseBlob;
 
   nsCString mOverrideMimeType;
 
   /**
    * The notification callbacks the channel had when Send() was
@@ -308,36 +331,42 @@ protected:
 
   nsCOMPtr<nsIURI> mBaseURI;
 
   PRUint32 mState;
 
   nsRefPtr<nsXMLHttpRequestUpload> mUpload;
   PRUint64 mUploadTransferred;
   PRUint64 mUploadTotal;
+  PRPackedBool mUploadLengthComputable;
   PRPackedBool mUploadComplete;
+  PRPackedBool mProgressSinceLastProgressEvent;
   PRUint64 mUploadProgress; // For legacy
   PRUint64 mUploadProgressMax; // For legacy
 
   PRPackedBool mErrorLoad;
 
   PRPackedBool mTimerIsActive;
   PRPackedBool mProgressEventWasDelayed;
   PRPackedBool mLoadLengthComputable;
   PRUint64 mLoadTotal; // 0 if not known.
+  PRUint64 mLoadTransferred;
   nsCOMPtr<nsITimer> mProgressNotifier;
 
   PRPackedBool mFirstStartRequestSeen;
+  PRPackedBool mInLoadProgressEvent;
   
   nsCOMPtr<nsIAsyncVerifyRedirectCallback> mRedirectCallback;
   nsCOMPtr<nsIChannel> mNewRedirectChannel;
   
   jsval mResultJSON;
   JSObject* mResultArrayBuffer;
 
+  void ResetResponse();
+
   struct RequestHeader
   {
     nsCString header;
     nsCString value;
   };
   nsTArray<RequestHeader> mModifiedRequestHeaders;
 };
 
--- a/content/base/test/Makefile.in
+++ b/content/base/test/Makefile.in
@@ -261,16 +261,17 @@ include $(topsrcdir)/config/rules.mk
 		test_bug450160.html \
 		test_bug453736.html \
 		test_bug454326.html \
 		test_bug505783.html \
 		test_bug457746.html \
 		test_bug587931.html \
 		test_bug592829.html \
 		test_bug518104.html \
+		test_bug682463.html \
 		bug457746.sjs \
 		test_CrossSiteXHR.html \
 		test_CrossSiteXHR_origin.html \
 		file_CrossSiteXHR_inner.html \
 		file_CrossSiteXHR_inner_data.sjs \
 		file_CrossSiteXHR_inner.jar \
 		file_CrossSiteXHR_server.sjs \
 		test_CrossSiteXHR_cache.html \
@@ -493,16 +494,18 @@ include $(topsrcdir)/config/rules.mk
 		badMessageEvent.eventsource \
 		badMessageEvent.eventsource^headers^ \
 		forRemoval.resource \
 		forRemoval.resource^headers^ \
 		accesscontrol.resource \
 		accesscontrol.resource^headers^ \
 		invalid_accesscontrol.resource \
 		invalid_accesscontrol.resource^headers^ \
+		test_xhr_progressevents.html \
+		progressserver.sjs \
 		somedatas.resource \
 		somedatas.resource^headers^ \
 		delayedServerEvents.sjs \
 		test_bug664916.html \
 		test_bug666604.html \
 		test_bug675121.html \
 		file_bug675121.sjs \
 		test_bug654352.html \
new file mode 100644
--- /dev/null
+++ b/content/base/test/progressserver.sjs
@@ -0,0 +1,51 @@
+const CC = Components.Constructor;
+const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1",
+                             "nsIBinaryInputStream",
+                             "setInputStream");
+
+function setReq(req) {
+  setObjectState("content/base/test/progressserver", req);
+}
+
+function getReq() {
+  var req;
+  getObjectState("content/base/test/progressserver", function(v) {
+    req = v;
+  });
+  return req;
+}
+
+function handleRequest(request, response)
+{
+  var pairs = request.queryString.split('&');
+  var command = pairs.shift();
+
+  var bodyStream = new BinaryInputStream(request.bodyInputStream);
+  var body = "";
+  var bodyAvail;
+  while ((bodyAvail = bodyStream.available()) > 0)
+    body += String.fromCharCode.apply(null, bodyStream.readByteArray(bodyAvail));
+
+  if (command == "open") {
+    response.processAsync();
+    setReq(response);
+
+    response.setHeader("Cache-Control", "no-cache", false);
+    pairs.forEach(function (val) {
+      var [name, value] = val.split('=');
+      response.setHeader(name, unescape(value), false);
+    });
+    response.write(body);
+    return;
+  }
+
+  if (command == "send") {
+    getReq().write(body);
+  }
+  else if (command == "close") {
+    getReq().finish();
+    setReq(null);
+  }
+  response.setHeader("Content-Type", "text/plain");
+  response.write("ok");
+}
--- a/content/base/test/test_XHR.html
+++ b/content/base/test/test_XHR.html
@@ -9,51 +9,16 @@
 <p id="display"></p>
 <div id="content" style="display: none">
   
 </div>
 <pre id="test">
 <script class="testbody" type="text/javascript">
 SimpleTest.waitForExplicitFinish();
 
-// test receiving as JSON
-function testJSON(aJsonStr, invalid) {
-  var errorThrown = false;
-  var anotherErrorThrown = false;
-  var xhr = new XMLHttpRequest();
-  
-  var didthrow = false;
-  try { xhr.responseType = 'moz-json'; } catch (e) { didthrow = true; }
-  ok(didthrow, 
-     "should have thrown when setting responseType to moz-json before open");
-
-  xhr.open("POST", 'responseIdentical.sjs', false);
-  xhr.responseType = 'moz-json';
-  xhr.send(aJsonStr);
-
-  if (!invalid) {
-    is(JSON.stringify(xhr.response), aJsonStr);
-    is(xhr.response, xhr.response, "returning the same object on each access");
-  }
-  else {
-    var didThrow = false;
-    try { xhr.response } catch(ex) { didThrow = true; }
-    ok(didThrow, "accessing response should throw");
-
-    didThrow = false;
-    try { xhr.response } catch(ex) { didThrow = true; }
-    ok(didThrow, "accessing response should throw");
-  } 
-}
-
-var jsonStr = '{"title":"aBook","author":"john"}';
-testJSON(jsonStr, false);
-var invalidJson = '{ "abc": }'
-testJSON(invalidJson, true);
-
 var path = "/tests/content/base/test/";
 
 var passFiles = [['file_XHR_pass1.xml', 'GET'],
                  ['file_XHR_pass2.txt', 'GET'],
                  ['file_XHR_pass3.txt', 'GET'],
                  ];
 
 var failFiles = [['//example.com' + path + 'file_XHR_pass1.xml', 'GET'],
@@ -104,28 +69,35 @@ function checkResponseTextAccessThrows(x
   try { xhr.responseText } catch (e) { didthrow = true; }
   ok(didthrow, "should have thrown when accessing responseText");
 }
 function checkResponseXMLAccessThrows(xhr) {
   var didthrow = false;
   try { xhr.responseXML } catch (e) { didthrow = true; }
   ok(didthrow, "should have thrown when accessing responseXML");
 }
-function checkSetResponseTypeThrows(xhr) {
+function checkResponseAccessThrows(xhr) {
   var didthrow = false;
-  try { xhr.responseType = 'document'; } catch (e) { didthrow = true; }
-  ok(didthrow, "should have thrown when accessing responseType");
+  try { xhr.response } catch (e) { didthrow = true; }
+  ok(didthrow, "should have thrown when accessing response");
+}
+function checkSetResponseTypeThrows(xhr, type) {
+  var didthrow = false;
+  try { xhr.responseType = type; } catch (e) { didthrow = true; }
+  ok(didthrow, "should have thrown when setting responseType");
 }
 
 xhr = new XMLHttpRequest();
-checkSetResponseTypeThrows(xhr);
+checkSetResponseTypeThrows(xhr, "document");
 xhr.open("GET", 'file_XHR_pass1.xml', false); 
+checkSetResponseTypeThrows(xhr, "moz-chunked-text");
+checkSetResponseTypeThrows(xhr, "moz-chunked-arraybuffer");
 xhr.responseType = 'document';
 xhr.send(null);
-checkSetResponseTypeThrows(xhr);
+checkSetResponseTypeThrows(xhr, "document");
 is(xhr.status, 200, "wrong status");
 checkResponseTextAccessThrows(xhr);
 is((new XMLSerializer()).serializeToString(xhr.response.documentElement),
    "<res>hello</res>",
    "wrong response");
 
 // test response (responseType='text')
 xhr = new XMLHttpRequest();
@@ -173,26 +145,40 @@ xhr.open("GET", 'file_XHR_binary1.bin', 
 xhr.responseType = 'arraybuffer';
 xhr.send(null)
 is(xhr.status, 200, "wrong status");
 checkResponseTextAccessThrows(xhr);
 checkResponseXMLAccessThrows(xhr);
 ab = xhr.response;
 ok(ab != null, "should have a non-null arraybuffer");
 arraybuffer_equals_to(ab, "\xaa\xee\0\x03\xff\xff\xff\xff\xbb\xbb\xbb\xbb");
+is(xhr.response, xhr.response, "returns the same ArrayBuffer");
 
-// test array buffer GetResult returns the same object
-xhr = new XMLHttpRequest();
-xhr.open("GET", 'file_XHR_binary1.bin', false); 
-xhr.responseType = 'arraybuffer';
-xhr.send(null)
+// test response (responseType='moz-json')
+var xhr = new XMLHttpRequest();
+xhr.open("POST", 'responseIdentical.sjs', false);
+xhr.responseType = 'moz-json';
+jsonObjStr = JSON.stringify({title: "aBook", author: "john"});
+xhr.send(jsonObjStr);
 is(xhr.status, 200, "wrong status");
 checkResponseTextAccessThrows(xhr);
 checkResponseXMLAccessThrows(xhr);
-is(xhr.response, xhr.response, "returns the same ArrayBuffer");
+is(JSON.stringify(xhr.response), jsonObjStr, "correct result");
+is(xhr.response, xhr.response, "returning the same object on each access");
+
+// with invalid json
+var xhr = new XMLHttpRequest();
+xhr.open("POST", 'responseIdentical.sjs', false);
+xhr.responseType = 'moz-json';
+xhr.send("{");
+is(xhr.status, 200, "wrong status");
+checkResponseTextAccessThrows(xhr);
+checkResponseXMLAccessThrows(xhr);
+checkResponseAccessThrows(xhr);
+checkResponseAccessThrows(xhr); // Check twice to ensure that we still throw
 
 // test response (responseType='blob')
 var onloadCount = 0;
 function checkOnloadCount() {
   if (++onloadCount >= 2) SimpleTest.finish();
 };
 
 // with a simple text file
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_bug682463.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=682463
+-->
+<head>
+  <title>Test for Bug 682463</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=682463">Mozilla Bug 682463</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 682463 **/
+
+  function text(s) {
+    return document.createTextNode(s);
+  }
+  function div(l,r) {
+    var div = document.createElement("DIV");
+    if (l) div.appendChild(l);
+    if (r) div.appendChild(r);
+    return div;
+  }
+  function createRange(sn,so,en,eo) {
+    var r = document.createRange();
+    r.setStart(sn,so);
+    r.setEnd(en,eo);
+    return r;
+  }
+  function verifyRange(msg,r,sn,so,en,eo) {
+    ok(r.startContainer == sn && r.startOffset == so &&
+       r.endContainer == en && r.endOffset == eo, msg);
+  }
+  function showRange(r,msg) {
+    var s = "" + r.startContainer + ":  " + r.startOffset;
+    s+= '\n';
+    s += "" + r.endContainer + ":  " + r.endOffset;
+    alert(msg + ':\n' + s)
+  }
+
+  var tests = [
+  function() {
+    var t = text("foobar");
+    var r = createRange(t,2,t,t.length);
+    var t2 = t.splitText(1);
+    verifyRange("split before, no parent",r,t2,1,t2,5);
+  },
+  function() {
+    var t = text("foobar");
+    var r = createRange(t,0,t,t.length);
+    var t2 = t.splitText(3);
+    verifyRange("split middle, no parent",r,t,0,t,3);
+  },
+  function() {
+    var t = text("foobar");
+    var r = createRange(t,0,t,t.length);
+    var n = t.length;
+    var t2 = t.splitText(n);
+    verifyRange("split after, no parent",r,t,0,t,n);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    var r = createRange(t,0,t,t.length);
+    var t2 = t.splitText(3);
+    verifyRange("split middle, parent",r,t,0,t2,3);
+    parent.removeChild(t);
+    verifyRange("removed left, parent",r,parent,0,t2,3);
+    var t2b = t2.splitText(1);
+    verifyRange("split middle, parent, end",r,parent,0,t2b,2);
+  },
+  function() {
+    var t0 = text("x");
+    var t = text("foobar");
+    var parent = div(t0,t);
+    var r = createRange(t,0,t,t.length);
+    var t2 = t.splitText(3);
+    parent.removeChild(t);
+    verifyRange("removed left, text sibling",r,parent,1,t2,3);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    var r = createRange(t,2,t,t.length);
+    var t2 = t.splitText(1);
+    verifyRange("split before, parent",r,t2,1,t2,5);
+    parent.removeChild(t2);
+    verifyRange("removed right, parent",r,parent,1,parent,1);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    var r = createRange(t,0,t,t.length);
+    var n = t.length;
+    var t2 = t.splitText(n);
+    verifyRange("split after, parent",r,t,0,t,n);
+    r.setEnd(t2,0);
+    verifyRange("split after, parent, extend",r,t,0,t2,0);
+    t2.splitText(0);
+    verifyRange("split after, parent, extend, split end",r,t,0,t2,0);
+    t2.textContent = "baz";
+    t2.splitText(2);
+    verifyRange("split after, parent, extend, split after end",r,t,0,t2,0);
+    r.setEnd(t2,2);
+    var t2b = t2.splitText(1);
+    verifyRange("split after, parent, split end",r,t,0,t2b,1);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    document.body.appendChild(parent);
+    var r = createRange(t,0,t,t.length);
+    var t2 = t.splitText(3);
+    verifyRange("split middle, in document",r,t,0,t2,3);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    document.body.appendChild(parent);
+    var r = createRange(t,2,t,t.length);
+    var t2 = t.splitText(1);
+    verifyRange("split before, in document",r,t2,1,t2,5);
+  },
+  function() {
+    var t = text("foobar");
+    var parent = div(t);
+    document.body.appendChild(parent);
+    var r = createRange(t,0,t,t.length);
+    var n = t.length;
+    var t2 = t.splitText(n);
+    verifyRange("split after, in document",r,t,0,t,n);
+  }
+  ];
+
+  function runTests() {
+    var len = tests.length;
+    for (var i = 0; i < len; ++i) {
+      tests[i]();
+    }
+    SimpleTest.finish();
+  }
+
+addLoadEvent(runTests);
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_xhr_progressevents.html
@@ -0,0 +1,282 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test for XMLHttpRequest Progress Events</title>
+  <script type="text/javascript" src="/MochiKit/packed.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body onload="gen.next();">
+<pre id=l></pre>
+<script type="application/javascript;version=1.7">
+SimpleTest.waitForExplicitFinish();
+
+var gen = runTests();
+
+function log(s) {
+  //document.getElementById("l").textContent += s + "\n";
+}
+
+function getEvent(e) {
+  log("got event: " + e.type + " (" + e.target.readyState + ")");
+  gen.send(e);
+}
+
+function startsWith(a, b) {
+  return a.substr(0, b.length) === b;
+}
+
+function updateProgress(e, data, testName) {
+  var test = " while running " + testName;
+  is(e.type, "progress", "event type" + test);
+  
+  let response;
+  if (data.nodata) {
+    is(e.target.response, null, "response should be null" + test);
+    response = null;
+  }
+  else if (data.text) {
+    is(typeof e.target.response, "string", "response should be a string" + test);
+    response = e.target.response;
+  }
+  else {
+    ok(e.target.response instanceof ArrayBuffer, "response should be a ArrayBuffer" + test);
+    response = bufferToString(e.target.response);
+  }
+
+  if (!data.nodata && !data.encoded) {
+    if (!data.chunked) {
+      is(e.loaded, response.length, "event.loaded matches response size" + test);
+    }
+    else {
+      is(e.loaded - data.receivedBytes, response.length,
+         "event.loaded grew by response size" + test);
+    }
+  }
+  ok(e.loaded > data.receivedBytes, "event.loaded increased" + test);
+  ok(e.loaded - data.receivedBytes <= data.pendingBytes,
+     "event.loaded didn't increase too much" + test);
+
+  if (!data.nodata) {
+    var newData;
+    ok(startsWith(response, data.receivedResult),
+       "response strictly grew" + test);
+    newData = response.substr(data.receivedResult.length);
+  
+    if (!data.encoded) {
+      ok(newData.length > 0, "sanity check for progress" + test);
+    }
+    ok(startsWith(data.pendingResult, newData), "new data matches expected" + test);
+  }
+
+  is(e.lengthComputable, "total" in data, "lengthComputable" + test);
+  if ("total" in data) {
+    is(e.total, data.total, "total" + test);
+  }
+
+  if (!data.nodata) {
+    data.pendingResult = data.pendingResult.substr(newData.length);
+  }
+  data.pendingBytes -= e.loaded - data.receivedBytes;
+  data.receivedResult = response;
+  data.receivedBytes = e.loaded;
+}
+
+function sendData(s) {
+  var xhr = new XMLHttpRequest();
+  xhr.open("POST", "progressserver.sjs?send");
+  xhr.sendAsBinary(s);
+}
+
+function closeConn() {
+  log("in closeConn");
+  var xhr = new XMLHttpRequest();
+  xhr.open("POST", "progressserver.sjs?close");
+  xhr.send();
+}
+
+var longString = "long";
+while(longString.length < 65536)
+  longString += longString;
+
+function utf8encode(s) {
+  return unescape(encodeURIComponent(s));
+}
+
+function bufferToString(buffer) {
+  return String.fromCharCode.apply(String, new Uint8Array(buffer));
+}
+
+function runTests() {
+  var xhr = new XMLHttpRequest();
+  xhr.onprogress = xhr.onload = xhr.onerror = xhr.onreadystatechange = xhr.onloadend = getEvent;
+
+  var responseTypes = [{ type: "text", text: true },
+                       { type: "arraybuffer", text: false, nodata: true },
+                       { type: "blob", text: false, nodata: true },
+                       { type: "document", text: true, nodata: true },
+                       { type: "moz-json", text: true, nodata: true },
+                       { type: "", text: true },
+                       { type: "moz-chunked-text", text: true, chunked: true },
+                       { type: "moz-chunked-arraybuffer", text: false, chunked: true },
+                      ];
+  var responseType;
+  while (responseType = responseTypes.shift()) {
+    let tests = [{ open: "Content-Type=text/plain", name: "simple test" },
+                 { data: "hello world" },
+                 { data: "\u0000\u0001\u0002\u0003" },
+                 { data: longString },
+                 { data: "x" },
+                 { close: true },
+                 { open: "Content-Type=text/plain&Content-Length=20", name: "with length", total: 20 },
+                 // 5 bytes from the "ready" in the open step
+                 { data: "abcde" },
+                 { data: "0123456789" },
+                 { close: true },
+                 { open: "Content-Type=application/xml", data: "ready", name: "without length, as xml" },
+                 { data: "<out>" },
+                 { data: "text" },
+                 { data: "</foo>invalid" },
+                 { close: true },
+                 { open: "Content-Type=text/plain;charset%3dutf-8", name: "utf8 data", encoded: true },
+                 { data: utf8encode("räksmörgås"), utf16: "räksmörgås" },
+                 { data: utf8encode("Å").substr(0,1), utf16: "" },
+                 { data: utf8encode("Å").substr(1), utf16: "Å" },
+                 { data: utf8encode("aöb").substr(0,2), utf16: "a" },
+                 { data: utf8encode("aöb").substr(2), utf16: "öb" },
+                 { data: utf8encode("a\u867Eb").substr(0,3), utf16: "a" },
+                 { data: utf8encode("a\u867Eb").substr(3,1), utf16: "\u867E" },
+                 { data: utf8encode("a\u867Eb").substr(4), utf16: "b" },
+                 { close: true },
+                 ];
+    let testState = { index: 0 };
+  
+    for (let i = 0; i < tests.length; ++i) {
+      let test = tests[i];
+      testState.index++;
+      if ("open" in test) {
+        log("opening " + testState.name);
+        testState = { name: test.name + " for " + responseType.type,
+                      index: 0,
+                      pendingResult: "ready",
+                      pendingBytes: 5,
+                      receivedResult: "",
+                      receivedBytes: 0,
+                      total: test.total,
+                      encoded: test.encoded,
+                      nodata: responseType.nodata,
+                      chunked: responseType.chunked,
+                      text: responseType.text };
+  
+        xhr.onreadystatechange = null;
+        xhr.open("POST", "progressserver.sjs?open&" + test.open);
+        xhr.responseType = responseType.type;
+        xhr.send("ready");
+        xhr.onreadystatechange = getEvent;
+
+        let e = yield;
+        is(e.type, "readystatechange", "should readystate to headers-received starting " + testState.name);
+        is(xhr.readyState, xhr.HEADERS_RECEIVED, "should be in state HEADERS_RECEIVED starting " + testState.name);
+  
+        e = yield;
+        is(e.type, "readystatechange", "should readystate to loading starting " + testState.name);
+        is(xhr.readyState, xhr.LOADING, "should be in state LOADING starting " + testState.name);
+        if (typeof testState.total == "undefined")
+          delete testState.total;
+      }
+      else if ("close" in test) {
+        log("closing");
+        closeConn();
+
+        e = yield;
+        is(e.type, "readystatechange", "should readystate to done closing " + testState.name);
+        is(xhr.readyState, xhr.DONE, "should be in state DONE closing " + testState.name);
+        log("readystate to 4");
+
+        if (responseType.chunked) {
+          xhr.responseType;
+          is(xhr.response, null, "chunked data has null response for " + testState.name);
+        }
+      
+        e = yield;
+        is(e.type, "load", "should fire load closing " + testState.name);
+        is(e.lengthComputable, true, "length should be computable during load closing " + testState.name);
+        log("got load");
+
+        if (responseType.chunked) {
+          is(xhr.response, null, "chunked data has null response for " + testState.name);
+        }
+      
+        e = yield;
+        is(e.type, "loadend", "should fire loadend closing " + testState.name);
+        is(e.lengthComputable, true, "length should be computable during loadend closing " + testState.name);
+        log("got loadend");
+
+        if (responseType.chunked) {
+          is(xhr.response, null, "chunked data has null response for " + testState.name);
+        }
+
+        if (!testState.nodata || responseType.chunked) {
+          // This branch intentionally left blank
+          // Under these conditions we check the response during updateProgress
+        }
+        else if (responseType.type === "arraybuffer") {
+          is(bufferToString(xhr.response), testState.pendingResult,
+             "full response for " + testState.name);
+        }
+        else if (responseType.type === "blob") {
+          let reader = new FileReader;
+          reader.readAsBinaryString(xhr.response);
+          reader.onloadend = getEvent;
+          yield;
+
+          is(reader.result, testState.pendingResult,
+             "full response in blob for " + testState.name);
+        }
+
+        testState.name = "";
+      }
+      else {
+        log("sending");
+        if (responseType.text) {
+          testState.pendingResult += "utf16" in test ? test.utf16 : test.data;
+        }
+        else {
+          testState.pendingResult += test.data;
+        }
+        testState.pendingBytes = test.data.length;
+        sendData(test.data);
+      }
+  
+      while(testState.pendingBytes) {
+        log("waiting for more bytes: " + testState.pendingBytes);
+        e = yield;
+        // Readystate can fire several times between each progress event.
+        if (e.type === "readystatechange")
+          continue;
+  
+        updateProgress(e, testState, "data for " + testState.name + "[" + testState.index + "]");
+        if (responseType.chunked) {
+          testState.receivedResult = "";
+        }
+      }
+
+      if (!testState.nodata) {
+        is(testState.pendingResult, "",
+           "should have consumed the expected result");
+      }
+
+      log("done with this test");
+    }
+  
+    is(testState.name, "", "forgot to close last test");
+  }
+
+  SimpleTest.finish();
+  yield;
+}
+
+</script>
+
+</body>
+</html>
--- a/embedding/android/CrashReporter.java.in
+++ b/embedding/android/CrashReporter.java.in
@@ -115,17 +115,17 @@ public class CrashReporter extends Activ
     mProgressDialog = new ProgressDialog(CrashReporter.this);
     mProgressDialog.setMessage(getString(R.string.sending_crash_report));
 
     final Button restartButton = (Button) findViewById(R.id.restart);
     final Button closeButton = (Button) findViewById(R.id.close);
     String passedMinidumpPath = getIntent().getStringExtra("minidumpPath");
     File passedMinidumpFile = new File(passedMinidumpPath);
     File pendingDir =
-      new File("/data/data/@ANDROID_PACKAGE_NAME@/mozilla/Crash Reports/pending");
+      new File("/data/data/@ANDROID_PACKAGE_NAME@/files/mozilla/Crash Reports/pending");
     pendingDir.mkdirs();
     mPendingMinidumpFile = new File(pendingDir, passedMinidumpFile.getName());
     moveFile(passedMinidumpFile, mPendingMinidumpFile);
 
     File extrasFile = new File(passedMinidumpPath.replaceAll(".dmp", ".extra"));
     mPendingExtrasFile = new File(pendingDir, extrasFile.getName());
     moveFile(extrasFile, mPendingExtrasFile);
 
@@ -290,17 +290,17 @@ public class CrashReporter extends Activ
       os.close();
       BufferedReader br = new BufferedReader(
         new InputStreamReader(conn.getInputStream()));
       HashMap<String, String>  responseMap = new HashMap<String, String>();
       readStringsFromReader(br, responseMap);
 
       if (conn.getResponseCode() == conn.HTTP_OK) {
         File submittedDir = new File(
-          "/data/data/@ANDROID_PACKAGE_NAME@/mozilla/Crash Reports/submitted");
+          "/data/data/@ANDROID_PACKAGE_NAME@/files/mozilla/Crash Reports/submitted");
         submittedDir.mkdirs();
         minidumpFile.delete();
         extrasFile.delete();
         String crashid = responseMap.get("CrashID");
         File file = new File(submittedDir, crashid + ".txt");
         FileOutputStream fos = new FileOutputStream(file);
         fos.write("Crash ID: ".getBytes());
         fos.write(crashid.getBytes());
--- a/embedding/android/GeckoAppShell.java
+++ b/embedding/android/GeckoAppShell.java
@@ -273,17 +273,18 @@ public class GeckoAppShell
     public static void loadGeckoLibs(String apkName) {
         // The package data lib directory isn't placed in ld.so's
         // search path, so we have to manually load libraries that
         // libxul will depend on.  Not ideal.
         System.loadLibrary("mozutils");
         GeckoApp geckoApp = GeckoApp.mAppContext;
         String homeDir;
         if (Build.VERSION.SDK_INT < 8 ||
-            geckoApp.getApplication().getPackageResourcePath().startsWith("/data")) {
+            geckoApp.getApplication().getPackageResourcePath().startsWith("/data") ||
+            geckoApp.getApplication().getPackageResourcePath().startsWith("/system")) {
             File home = geckoApp.getFilesDir();
             homeDir = home.getPath();
             // handle the application being moved to phone from sdcard
             File profileDir = new File(homeDir, "mozilla");
             File oldHome = new File("/data/data/" + 
                         GeckoApp.mAppContext.getPackageName() + "/mozilla");
             if (oldHome.exists())
                 moveDir(oldHome, profileDir);
--- a/embedding/components/printingui/src/win/nsPrintDialogUtil.cpp
+++ b/embedding/components/printingui/src/win/nsPrintDialogUtil.cpp
@@ -545,16 +545,19 @@ static HWND CreateGroupBox(HINSTANCE    
 {
   return CreateControl("BUTTON", BS_GROUPBOX, aHInst, aHdlg, aId, aStr, aRect);
 }
 
 //--------------------------------------------------------
 // Localizes and initializes the radio buttons and group
 static void InitializeExtendedDialog(HWND hdlg, PRInt16 aHowToEnableFrameUI) 
 {
+  NS_ABORT_IF_FALSE(aHowToEnableFrameUI != nsIPrintSettings::kFrameEnableNone,
+                    "should not be called");
+
   // Localize the new controls in the print dialog
   nsCOMPtr<nsIStringBundle> strBundle;
   if (NS_SUCCEEDED(GetLocalizedBundle(PRINTDLG_PROPERTIES, getter_AddRefs(strBundle)))) {
     PRInt32 i = 0;
     while (gAllPropKeys[i].mKeyStr != NULL) {
       SetText(hdlg, gAllPropKeys[i].mKeyId, strBundle, gAllPropKeys[i].mKeyStr);
       i++;
     }
@@ -563,33 +566,23 @@ static void InitializeExtendedDialog(HWN
   // Set up radio buttons
   if (aHowToEnableFrameUI == nsIPrintSettings::kFrameEnableAll) {
     SetRadio(hdlg, rad4, PR_FALSE);  
     SetRadio(hdlg, rad5, PR_TRUE); 
     SetRadio(hdlg, rad6, PR_FALSE);
     // set default so user doesn't have to actually press on it
     gFrameSelectedRadioBtn = rad5;
 
-  } else if (aHowToEnableFrameUI == nsIPrintSettings::kFrameEnableAsIsAndEach) {
+  } else { // nsIPrintSettings::kFrameEnableAsIsAndEach
     SetRadio(hdlg, rad4, PR_FALSE);  
     SetRadio(hdlg, rad5, PR_FALSE, PR_FALSE); 
     SetRadio(hdlg, rad6, PR_TRUE);
     // set default so user doesn't have to actually press on it
     gFrameSelectedRadioBtn = rad6;
-
-
-  } else {  // nsIPrintSettings::kFrameEnableNone
-    // we are using this function to disabe the group box
-    SetRadio(hdlg, grp3, PR_FALSE, PR_FALSE); 
-    // now disable radiobuttons
-    SetRadio(hdlg, rad4, PR_FALSE, PR_FALSE); 
-    SetRadio(hdlg, rad5, PR_FALSE, PR_FALSE); 
-    SetRadio(hdlg, rad6, PR_FALSE, PR_FALSE); 
   }
-
 }
 
 
 //--------------------------------------------------------
 // Special Hook Procedure for handling the print dialog messages
 static UINT CALLBACK PrintHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
 {
 
@@ -600,16 +593,20 @@ static UINT CALLBACK PrintHookProc(HWND 
       SetRadioOfGroup(hdlg, id);
     }
 
   } else if (uiMsg == WM_INITDIALOG) {
     PRINTDLG * printDlg = (PRINTDLG *)lParam;
     if (printDlg == NULL) return 0L;
 
     PRInt16 howToEnableFrameUI = (PRInt16)printDlg->lCustData;
+    // don't add frame options if they would be disabled anyway
+    // because there are no frames
+    if (howToEnableFrameUI == nsIPrintSettings::kFrameEnableNone)
+      return TRUE;
 
     HINSTANCE hInst = (HINSTANCE)::GetWindowLongPtr(hdlg, GWLP_HINSTANCE);
     if (hInst == NULL) return 0L;
 
     // Start by getting the local rects of several of the controls
     // so we can calculate where the new controls are
     HWND wnd = ::GetDlgItem(hdlg, grp1);
     if (wnd == NULL) return 0L;
@@ -1101,16 +1098,21 @@ static BOOL APIENTRY PropSheetCallBack(H
     }
 
   } else if (uiMsg == WM_INITDIALOG) {
     // Create the groupbox and Radiobuttons on the "Options" Property Sheet
 
     // We temporarily borrowed the global value for initialization
     // now clear it before the dialog appears
     PRInt16 howToEnableFrameUI = gFrameSelectedRadioBtn;
+    // don't add frame options if they would be disabled anyway
+    // because there are no frames
+    if (howToEnableFrameUI == nsIPrintSettings::kFrameEnableNone)
+      return TRUE;
+
     gFrameSelectedRadioBtn     = 0;
 
     HINSTANCE hInst = (HINSTANCE)::GetWindowLongPtr(hdlg, GWLP_HINSTANCE);
     if (hInst == NULL) return 0L;
 
     // Get default font for the dialog & then its font metrics
     // we need the text height to determine the height of the radio buttons
     TEXTMETRIC metrics;
--- a/js/src/config/system-headers
+++ b/js/src/config/system-headers
@@ -35,17 +35,16 @@ app/Message.h
 app/MessageRunner.h
 arpa/inet.h
 arpa/nameser.h
 asm/sigcontext.h
 asm/signal.h
 ASRegistry.h
 assert.h
 atk/atk.h
-atlbase.h
 atlcom.h
 atlconv.h
 atlctl.cpp
 atlctl.h
 ATLCTL.H
 atlhost.h
 atlimpl.cpp
 atlwin.cpp
--- a/layout/generic/test/Makefile.in
+++ b/layout/generic/test/Makefile.in
@@ -120,16 +120,17 @@ include $(topsrcdir)/config/rules.mk
   file_bug579767_2.html \
   test_bug522632.html \
   test_bug589621.html \
   test_bug589623.html \
   test_bug633762.html \
   bug633762_iframe.html \
   $(srcdir)/../../reftests/backgrounds/blue-32x32.png \
   $(srcdir)/../../reftests/backgrounds/fuchsia-32x32.png \
+  test_selection_splitText-normalize.html \
   $(NULL)
 
 _CHROME_FILES = \
   test_bug632379.xul \
   test_bug508115.xul \
   test_bug469613.xul \
   test_bug469774.xul \
   test_backspace_delete.xul \
new file mode 100644
--- /dev/null
+++ b/layout/generic/test/test_selection_splitText-normalize.html
@@ -0,0 +1,173 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=191864
+-->
+<head>
+  <title>Test for Bug 191864</title>
+  <script type="application/javascript" src="/MochiKit/packed.js"></script>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=191864">Mozilla Bug 191864</a>
+<p id="display">
+<span id="col1" style="float:left; height:800px; width:180px;"></span>
+<span id="col2" style="float:left; height:800px; width:180px;"></span>
+</p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script type="application/javascript;version=1.7">
+var tests = [
+ [ {}, [0,4], "012345678" ],
+ [ {}, [0,0], "012345678" ],
+ [ {}, [0,9], "012345678" ],
+ [ {startOffset:4}, [0,4], "012345678" ],
+ [ {startOffset:5}, [0,4], "012345678" ],
+ [ {startOffset:5,endOffset:6}, [0,4], "012345678" ],
+ [ {endOffset:5}, [0,4], "012345678" ],
+ [ {endOffset:4}, [0,4], "012345678" ],
+ [ {endOffset:3}, [0,4], "012345678" ],
+ [ {startOffset:1,endOffset:3}, [0,4], "012345678" ],
+ [ {startOffset:7,endOffset:7}, [0,4], "012345678" ],
+ [ {startOffset:4,endOffset:4}, [0,4], "012345678" ],
+ [ {endNode:1}, [0,4], "012345678", "" ],
+ [ {endNode:1}, [0,4], "01234567", "8" ],
+ [ {endNode:1}, [1,4], "0", "12345678" ],
+ [ {endNode:2}, [1,4], "0", "12345", "678" ],
+]
+
+function runtest(r,p,t) {
+  // create content
+  document.original_nodes = [];
+  for (let i = 2; i < t.length; ++i) {
+    c = document.createTextNode(t[i]);
+    p.appendChild(c);
+    document.original_nodes.push(c);
+  }
+
+  // setup the range
+  let sel = t[0]
+  let startNode = p.firstChild;
+  let startOffset = sel.startOffset === undefined ? 0 : sel.startOffset;
+  let endNode = sel.endNode === undefined ? startNode : p.childNodes[sel.endNode];
+  let endOffset = sel.endOffset === undefined ? endNode.length : sel.endOffset;
+  r.setStart(startNode, startOffset);
+  r.setEnd(endNode, endOffset);
+
+  // splitText
+  let split = t[1]
+  p.childNodes[split[0]].splitText(split[1])
+}
+function test_split(r,p,t) {
+    runtest(r,p,t);
+}
+function test_split_merge(r,p,t) {
+    runtest(r,p,t);
+    p.normalize();
+}
+</script>
+
+<script type="application/javascript;version=1.7">
+
+/** Test for Bug 191864 **/
+
+var results = [
+/* test_split */
+ [ {},                                        [ [0, "0123"], "45678" ]],
+ [ {},                                        [ [0, ""], "012345678" ]],
+ [ {endNode:0, endOffset:9},                  [ [0, "012345678"], "" ]],
+ [ {startOffset:4},                           [ [0, "0123"], "45678" ]],
+ [ {startNode:1, startOffset:1},              [ [0, "0123"], "45678" ]],
+ [ {startNode:1, startOffset:1, endOffset:2}, [ [0, "0123"], "45678" ]],
+ [ {endOffset:1},                             [ [0, "0123"], "45678" ]],
+ [ {endNode:0},                               [ [0, "0123"], "45678" ]],
+ [ {endNode:0, endOffset:3},                  [ [0, "0123"], "45678" ]],
+ [ {startOffset:1, endNode:0, endOffset:3},   [ [0, "0123"], "45678" ]],
+ [ {startNode:1, startOffset:3, endOffset:3}, [ [0, "0123"], "45678" ]],
+ [ {startOffset:4, endNode:0},                [ [0, "0123"], "45678" ]],
+ [ {endNode:2, endOffset:0},                  [ [0, "0123"], "45678", [1, ""] ]],
+ [ {endNode:2},                               [ [0, "0123"], "4567", [1, "8"] ]],
+ [ {endNode:2},                               [ [0, "0"], [1, "1234"], "5678" ]],
+ [ {endNode:3},                               [ [0, "0"], [1, "1234"], "5", [2, "678"] ]],
+/* test_split_merge */
+ [ {},                                        [ [0, "012345678" ] ]],
+ [ {startParent:true},                        [ "012345678" ]],     /* splitText() creates an empty first child which is removed by normalize() */
+ [ {},                                        [ [0, "012345678" ] ]],
+ [ {startOffset:4},                           [ [0, "012345678" ] ]],
+ [ {startOffset:5},                           [ [0, "012345678" ] ]],
+ [ {startOffset:5,endOffset:6},               [ [0, "012345678" ] ]],
+ [ {endOffset:5},                             [ [0, "012345678" ] ]],
+ [ {endOffset:4},                             [ [0, "012345678" ] ]],
+ [ {endOffset:3},                             [ [0, "012345678" ] ]],
+ [ {startOffset:1,endOffset:3},               [ [0, "012345678" ] ]],
+ [ {startOffset:7,endOffset:7},               [ [0, "012345678" ] ]],
+ [ {startOffset:4,endOffset:4},               [ [0, "012345678" ] ]],
+ [ {endParent:true},                          [ [0, "012345678" ] ]],
+ [ {},                                        [ [0, "012345678" ] ]],
+ [ {},                                        [ [0, "012345678" ] ]],
+ [ {},                                        [ [0, "012345678" ] ]],
+]
+
+function verifyResults(r,p,i) {
+  let nodes = results[i][1];
+  is(p.childNodes.length, nodes.length, "same number of DOM nodes" + " (test " + i + ")");
+  for (let j = 0; j < nodes.length; ++j) {
+    let a = nodes[j];
+    let b = p.childNodes[j];
+    if (a instanceof Array) {
+      is(b, document.original_nodes[a[0]], "same node" + " (test " + i + " child " + j + ")");
+      is(b.textContent, a[1], "contents2" + " (test " + i + " child " + j + ")");
+    } else {
+      is(b.nodeType, Node.TEXT_NODE, "text node" + " (test " + i + " child " + j + ")");
+      is(b.textContent, a, "contents1" + " (test " + i + " child " + j + ")");
+    }
+  }
+  let sel = results[i][0];
+  if (sel.todo) {
+    alert(r.startContainer + '\n' + r.startOffset + '\n' + r.endContainer + '\n' + r.endOffset + '\n')
+    return;
+  }
+  let startNode = sel.startNode === undefined ? p.firstChild : p.childNodes[sel.startNode];
+  let startOffset = sel.startOffset === undefined ? 0 : sel.startOffset;
+  if (sel.startParent) { startNode = p; startOffset = 0; }
+  let endNode = sel.endNode === undefined ? p.childNodes[p.childNodes.length>1 ? 1 : 0] : p.childNodes[sel.endNode];
+  let endOffset = sel.endOffset === undefined ? endNode.length : sel.endOffset;
+  if (sel.endParent) { endNode = p; endOffset = 1; }
+  is(r.startContainer, startNode, "range start node" + " (test " + i + ")");
+  is(r.startOffset, startOffset, "range start offset" + " (test " + i + ")");
+  is(r.endContainer, endNode, "range end node" + " (test " + i + ")");
+  is(r.endOffset, endOffset, "range end offset" + " (test " + i + ")");
+}
+
+function runTest() {
+  let col1 = document.getElementById('col1');
+  let col2 = document.getElementById('col2');
+  for (let i=0; i < tests.length; ++i) {
+    let t = tests[i];
+    let p = document.createElement('p')
+    col1.appendChild(p);
+    let r = document.createRange();
+    test_split(r,p,t);
+    verifyResults(r,p,i);
+  }
+  for (let i=0; i < tests.length; ++i) {
+    let t = tests[i];
+    let p = document.createElement('p')
+    col2.appendChild(p);
+    let r = document.createRange();
+    test_split_merge(r,p,t);
+    verifyResults(r,p,i+tests.length);
+  }
+  SimpleTest.finish();
+}
+
+window.onload = function() { setTimeout(runTest, 0); };
+SimpleTest.waitForExplicitFinish();
+
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/foreignObject-form-no-theme.svg
@@ -0,0 +1,14 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='500' height='200'>
+  <foreignObject width='500' height='500'>
+    <div xmlns='http://www.w3.org/1999/xhtml'>
+      <button style='-moz-appearance:none'>this is a button inside of SVG</button>
+      <br/>
+      <select style='-moz-appearance:none'>
+        <option>This is a menu inside of SVG</option>
+        <option>a second menu option</option>
+      </select>
+    </div>
+  </foreignObject>
+</svg>
+
+<!-- Bug 686581 -->
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/foreignObject-form-theme-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html><head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    <title>Testcase #2 for bug 686581</title>
+    <style type="text/css">
+
+        html,body {
+            color:black; background-color:white; font-size:16px; padding:0; margin:0;
+        }
+
+    </style>
+</head>
+<body>
+      <button>this is a button inside of SVG</button>
+      <br/>
+      <select>
+        <option>This is a menu inside of SVG</option>
+        <option>a second menu option</option>
+      </select>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/foreignObject-form-theme.svg
@@ -0,0 +1,14 @@
+<svg xmlns='http://www.w3.org/2000/svg' width='500' height='200'>
+  <foreignObject width='500' height='500'>
+    <div xmlns='http://www.w3.org/1999/xhtml'>
+      <button>this is a button inside of SVG</button>
+      <br/>
+      <select>
+        <option>This is a menu inside of SVG</option>
+        <option>a second menu option</option>
+      </select>
+    </div>
+  </foreignObject>
+</svg>
+
+<!-- Bug 686581 -->
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/foreignObject-img-form-theme-ref.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html><head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    <title>Testcase for bug 686581</title>
+    <style type="text/css">
+        html,body {
+            color:black; background-color:white; font-size:16px; padding:0; margin:0;
+        }
+    </style>
+</head>
+<body>
+
+<img src="foreignObject-form-no-theme.svg">
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/foreignObject-img-form-theme.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML>
+<html><head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+    <title>Testcase for bug 686581</title>
+    <style type="text/css">
+        html,body {
+            color:black; background-color:white; font-size:16px; padding:0; margin:0;
+        }
+    </style>
+</head>
+<body>
+
+<img src="foreignObject-form-theme.svg">
+
+</body>
+</html>
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -125,16 +125,18 @@ random == dynamic-use-nested-01.svg dyna
 == foreignObject-02.svg foreignObject-02-ref.svg
 == foreignObject-ancestor-style-change-01.svg foreignObject-ancestor-style-change-01-ref.svg
 == foreignObject-change-transform-01.svg pass.svg
 == foreignObject-display-01.svg pass.svg
 == foreignObject-move-repaint-01.svg pass.svg
 == foreignObject-overflow-01.svg pass.svg
 == foreignObject-start-hidden-01.svg pass.svg # followup from Bug 596765
 == foreignObject-start-hidden-02.svg pass.svg
+== foreignObject-img-form-theme.html foreignObject-img-form-theme-ref.html
+== foreignObject-form-theme.svg foreignObject-form-theme-ref.html
 == getElementById-a-element-01.svg pass.svg
 == gradient-live-01a.svg gradient-live-01-ref.svg
 == gradient-live-01b.svg gradient-live-01-ref.svg
 == gradient-live-01c.svg gradient-live-01-ref.svg
 == gradient-live-01d.svg gradient-live-01-ref.svg
 fails == inline-in-xul-basic-01.xul pass.svg
 == invalid-text-01.svg pass.svg
 == linearGradient-basic-01.svg pass.svg
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -189,16 +189,25 @@ GetDeviceOrientation(nsPresContext* aPre
         // Per spec, square viewports should be 'portrait'
         orientation = NS_STYLE_ORIENTATION_PORTRAIT;
     }
 
     aResult.SetIntValue(orientation, eCSSUnit_Enumerated);
     return NS_OK;
 }
 
+static nsresult
+GetIsResourceDocument(nsPresContext* aPresContext, const nsMediaFeature*,
+                      nsCSSValue& aResult)
+{
+  nsIDocument* doc = aPresContext->Document();
+  aResult.SetIntValue(doc && doc->IsResourceDoc() ? 1 : 0, eCSSUnit_Integer);
+  return NS_OK;
+}
+
 // Helper for two features below
 static nsresult
 MakeArray(const nsSize& aSize, nsCSSValue& aResult)
 {
     nsRefPtr<nsCSSValue::Array> a = nsCSSValue::Array::Create(2);
 
     a->Item(0).SetIntValue(aSize.width, eCSSUnit_Integer);
     a->Item(1).SetIntValue(aSize.height, eCSSUnit_Integer);
@@ -456,16 +465,23 @@ nsMediaFeatures::features[] = {
     {
         &nsGkAtoms::_moz_device_orientation,
         nsMediaFeature::eMinMaxNotAllowed,
         nsMediaFeature::eEnumerated,
         { kOrientationKeywords },
         GetDeviceOrientation
     },
     {
+        &nsGkAtoms::_moz_is_resource_document,
+        nsMediaFeature::eMinMaxNotAllowed,
+        nsMediaFeature::eBoolInteger,
+        { nsnull },
+        GetIsResourceDocument
+    },
+    {
         &nsGkAtoms::_moz_scrollbar_start_backward,
         nsMediaFeature::eMinMaxNotAllowed,
         nsMediaFeature::eBoolInteger,
         { &nsGkAtoms::scrollbar_start_backward },
         GetSystemMetric
     },
     {
         &nsGkAtoms::_moz_scrollbar_start_forward,
--- a/layout/svg/base/src/svg.css
+++ b/layout/svg/base/src/svg.css
@@ -39,25 +39,31 @@
 @namespace url(http://www.w3.org/2000/svg);
 
 style, script, symbol {
  display: none;
 }
 
 switch {
  -moz-binding: none !important;
-} 
+}
 
 svg:not(:root), symbol, image, marker, pattern, foreignObject {
  overflow: hidden;
 }
 
 foreignObject {
   margin: 0 ! important;
   padding: 0 ! important;
   border-width: 0 ! important;
 }
 
+@media all and (-moz-is-resource-document) {
+ foreignObject *|* {
+   -moz-appearance: none;
+ }
+}
+
 *|*::-moz-svg-foreign-content {
   display: block !important;
   position: static !important;
   text-indent: 0;
 }
--- a/mobile/chrome/content/TabsPopup.js
+++ b/mobile/chrome/content/TabsPopup.js
@@ -54,24 +54,22 @@ var TabsPopup = {
   },
 
   get button() {
     delete this.button;
     return this.button = document.getElementById("tool-tabs");
   },
 
   hide: function hide() {
+    this._hidePortraitMenu();
+
     if (!Util.isPortrait()) {
       Elements.urlbarState.removeAttribute("tablet_sidebar");
       ViewableAreaObserver.update();
-      return;
     }
-    this.box.hidden = true;
-    BrowserUI.popPopup(this);
-    window.removeEventListener("resize", this.resizeHandler, false);
   },
 
   show: function show() {
     if (!Util.isPortrait()) {
       Elements.urlbarState.setAttribute("tablet_sidebar", "true");
       ViewableAreaObserver.update();
       return;
     }
@@ -94,46 +92,61 @@ var TabsPopup = {
         let entry = browser.__SS_data.entries[0];
         caption = entry.title;
 
         let pageURI = Services.io.newURI(entry.url, null, null);
         try {
           let iconURI = gFaviconService.getFaviconImageForPage(pageURI);
           icon = iconURI.spec;
         } catch(ex) { }
+      } else {
+        if (caption == "about:blank")
+          caption = browser.currentURI.spec;
+        if (!icon) {
+          let iconURI = gFaviconService.getFaviconImageForPage(browser.currentURI);
+          icon = iconURI.spec;
+        }
       }
       item.setAttribute("img", icon);
       item.setAttribute("label", caption);
 
       this.list.appendChild(item);
       item.tab = aTab;
     }, this)
 
     // Set the box position.
     this.box.hidden = false;
     this.box.anchorTo(this.button, "after_end");
     BrowserUI.pushPopup(this, [this.box, this.button]);
 
-    window.addEventListener("resize", this.resizeHandler.bind(this), false);
+    window.addEventListener("resize", function resizeHandler(aEvent) {
+      if (aEvent.target != window)
+        return;
+      if (!Util.isPortrait())
+        TabsPopup._hidePortraitMenu();
+    }, false);
   },
 
   toggle: function toggle() {
     if (this.visible)
       this.hide();
     else
       this.show();
   },
 
   get visible() {
     return Util.isPortrait() ? !this.box.hidden : Elements.urlbarState.hasAttribute("tablet_sidebar");
   },
 
-  resizeHandler: function(aEvent) {
-    if (!Util.isPortrait())
-      this.hide();
+  _hidePortraitMenu: function _hidePortraitMenu() {
+    if (!this.box.hidden) {
+      this.box.hidden = true;
+      BrowserUI.popPopup(this);
+      window.removeEventListener("resize", resizeHandler, false);
+    }
   },
 
   closeTab: function(aTab) {
     messageManager.addMessageListener("Browser:CanUnload:Return", this.closeTabReturn.bind(this));
   },
 
   closeTabReturn: function(aMessage) {
     messageManager.removeMessageListener("Browser:CanUnload:Return", this.closeTabReturn.bind(this));
--- a/mobile/locales/en-US/chrome/preferences.dtd
+++ b/mobile/locales/en-US/chrome/preferences.dtd
@@ -16,8 +16,9 @@
 <!ENTITY language.auto                             "Auto-detect">
 <!ENTITY defaultBrowser.title                      "Default Browser">
 <!ENTITY defaultBrowser.description                "Make &brandShortName; your default browser">
 <!ENTITY homepage.title                            "Start page">
 <!ENTITY homepage.none                             "Blank Page">
 <!ENTITY homepage.default                          "&brandShortName; Start">
 <!ENTITY homepage.currentpage                      "Use Current Page">
 <!ENTITY showCharsetEncoding.title                 "Show character encoding">
+<!ENTITY actionbar.default                         "&brandShortName; Settings">
index 889727a1e02b4d0f60d9f03d518d898d3f7e45c0..56aa70600d8f55ccab862a4821e84b962c13bf8c
GIT binary patch
literal 207
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1Gg`O^sAsP4HUUKAWaNuAKcwfJ@?hNNH@7W4brUxB3{O@pd
z*=*TXduQfH4eOM@JMFmBvbR~^4}Z4So?HLIhf2Kz7eS^F4b&d7oSEnpcUJ7xF%Z|&
L)z4*}Q$iB}(Em9;
index 666af001dbbc902543836013dde9829309f012c9..bd83045e3f17f3c74d571a6e743b7df6bc3809d9
GIT binary patch
literal 252
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1G^E_P~Lo)8Yz2wN%Y#_jT;m-d&<r`Dyxm{c}MJicpm*Bh<
zMZ@|>$!fm*^+F890|(Xx)x8_ny*qwYAX8iJ=GnSx&*u>#A%9kd9?*&Z9rNnbAA#ts
z6@u?%e^|(t&-kn_wyyKe(U1GnmTmhdwrpLI!tC~McRwiGF$cf(>zKW`bw0>UPgg&e
IbxsLQ0R9M4p8x;=
index 620af6df9c931b35e8b745b0bca04cd84aa4b35e..0c77284867e3f311ccb8dc9d3d195a5926011c7f
GIT binary patch
literal 180
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1GVV*9IAsP4Ho_7>vP~c!N$naD8Z(`6?$n(%UFMC7G?nmjG
k3Lhk1C@T;T4D1RRr;4<Q{@lGI6lep3r>mdKI;Vst03Ql2p#T5?
index 90dcc1952cc2e0a4dc796b87ffcf45cc61b85caa..78acf1175da6a303a15773bacdbefdcef1472a88
GIT binary patch
literal 180
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1GVV*9IAsP4Ho_7>vP~c!N$net_o^XI~*@mY0{<Q};`5!$W
l<Ul-lptxaM!+{qESP$Opsa+JkULI%zgQu&X%Q~loCIETKH>Usq
index a88df03a4784a0bf4064008dc9478950abde1c25..70538a18df97b93845a178d3181d90a694808bf5
GIT binary patch
literal 194
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1GDV{ElAsP4HUfjsZpupqm_&xqmP>!rd-vchbgvANM78OVJ
yi<exn3l6_DPtL!=qK*F#)0T}v><q+%f{SeL`4gocTkpRI;(EIJxvX<aXaWEb3NUp5
index 0ede58ba06876d27295a94e116ee603b28551f4b..2cb82b3fd0c4657646665af9f947e780a514d5a1
GIT binary patch
literal 250
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1Gb39!fLo)8Yz2wN%pdi2+@V;Is`qr+)C9Qb^u8vD)+|;Tt
z=-!a_<g0qm<xj6c))5VO8xrR{jyrt%RmMwcx$gFt6&#h(IWsC|haSwy4_>+Y)8D19
z11r=foa&i&KW3-q`E3^8yk{)bzklkQsb0$WOLBs9+qHdHo&EZmbMJJJah|SzF6*2U
FngC;5Q*HnN
index c601ec80ba7c2321811ac11a28c29afbdfb1c489..a1e551ea3753d779c610cf10e62df01e0c35e689
GIT binary patch
literal 40011
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
--- a/mobile/themes/core/honeycomb/browser.css
+++ b/mobile/themes/core/honeycomb/browser.css
@@ -175,33 +175,36 @@ toolbarbutton.urlbar-button {
 #identity-box:-moz-locale-dir(rtl) {
   background-image: url("chrome://browser/skin/images/urlbar-border-side.png");
   background-position: bottom right;
   background-repeat: no-repeat;
 }
 
 /* add special color */
 #identity-box[mode="verifiedIdentity"] {
-  background-color: #89d715;
+  background-color: #c4eb8a;
 }
 
 #identity-box[mode="verifiedDomain"] {
-  background-color: #6579e3;
+  background-color: #b2bcf1;
 }
 
 #identity-popup-runBy-box,
 #identity-popup-connected-box {
   -moz-box-orient: vertical;
 }
 
 #urlbar-throbber[loading] {
   list-style-image: url("chrome://browser/skin/images/throbber.png");
 }
+#urlbar-throbber {
+  width: 24px;
+  height: 24px;
+}
 
-#urlbar-throbber,
 #urlbar-favicon {
   width: 32px;
   height: 32px;
   image-rendering: -moz-crisp-edges;
 }
 
 #urlbar-favicon[src=""] {
   list-style-image: url("chrome://browser/skin/images/favicon-default-32.png");
@@ -1719,53 +1722,55 @@ setting {
 #appmenu-popup-sitecommands > .appmenu-pageaction:nth-child(3n+2):last-child,
 #appmenu-popup-sitecommands > .appmenu-pageaction:nth-child(3n+2):nth-last-child(-3n+2),
 #appmenu-popup-sitecommands > .appmenu-pageaction:nth-child(3n+3):last-child {
   border-bottom: none;
 }
 
 /* Sync setup ------------------------------------------------------------- */
 .content-dialog > .prompt-title {
-  margin: @margin_normal@ @margin_large@ 0px;
+  margin: @margin_large@;
 }
 
-.content-dialog > .prompt-line,
-.content-dialog .prompt-message {
-  margin: 0px @margin_large@;
+.content-dialog > .prompt-line {
+  border-bottom: @border_width_xxlarge@ solid @color_divider_border@;
+  margin: 0 @margin_large@;
 }
 
 .content-dialog .prompt-message {
+  margin: 0px @margin_large@;
   border-bottom: @border_width_tiny@ solid @color_button_border@;
 }
 
 .syncsetup-center {
   /* TODO: remove this dummy when we no longer use it in other themes */
 }
 
 .syncsetup-code {
-  color: @color_text_textbox@;
-  background-color: @color_background_textbox@;
-  font-size: @font_xlarge@ !important;
-  padding: 0.2em 0.4em;
-  -moz-padding-end: 0.2em;
+  color: @color_text_header@;
+  background-color: @color_background_header@;
+  font-size: @font_xnormal@ !important;
+  font-weight: bold;
+  padding: .8em;
   letter-spacing: 0.2em;
   text-align: center;
-  min-width: 5.5em;
+  min-width: 8em;
+  margin: @margin_xtiny@ 0 0 0;
 }
 
 .syncsetup-label {
   color: @color_text_default@;
 }
 
 #syncsetup-customserver {
   -moz-margin-start: @margin_xnormal@;
 }
 
 #sync-message {
-  padding-bottom: 2em;
+  padding: 1em 0;
 }
 
 /* content scrollbars */
 .scroller {
   opacity: 0;
   background-color: @color_background_scroller@ !important;
   -moz-border-top-colors: none !important;
   -moz-border-bottom-colors: none !important;
@@ -1949,18 +1954,18 @@ setting {
   background-color: @color_background_highlight@;  
 }
 
 .documenttab-popup-closebutton:hover:active {
   background-image: none !important;
 }
 
 .documenttab-popup-checkmark {
-  min-width: -moz-calc(26px + 2 * @padding_normal@); /* size of the checkmark image  plus the padding */
-  padding: 0px @padding_normal@;
+  min-width: -moz-calc(26px + @padding_normal@) !important; /* size of the checkmark image  plus the padding */
+  -moz-padding-end: @padding_normal@;
 }
 
 .tab-popup-item.selected .documenttab-popup-checkmark {
   list-style-image: url("chrome://browser/skin/images/checkmark-hdpi.png");
 }
 
 .documenttab-popup-label {
   -moz-box-flex: 1;
--- a/mobile/themes/core/honeycomb/defines.inc
+++ b/mobile/themes/core/honeycomb/defines.inc
@@ -19,17 +19,17 @@
 %define color_background_header #6699ff
 %define color_text_header #fff
 %define color_background_scroller #9a9a9a
 %define color_background_textbox #fff
 %define color_text_textbox #000
 %define color_text_button #000
 %define color_text_disabled #808080
 %define color_text_placeholder #808080
-%define color_text_as_link #febc2b
+%define color_text_as_link #69f
 %define color_background_panelrow #c8c8c8
 %define color_text_panelrow #222222
 %define color_text_toolbutton_inverse #666666
 
 %define color_background_highlight #a7c5f4
 %define color_background_highlight_overlay rgba(167, 197, 244, 0.8)
 %define color_text_highlight #000
 %define color_selection #c0e49a
deleted file mode 100644
index 0e6454797144cbba3615bb3731836743d149eba1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 05e66d735511e57e87eb2e6af1db9984a2a0db43..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index daf52a6846c7e6da385ac4ed52156c57a6f21892..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 0ef93455d999f16666d981cea5c6d777ae71b0ad..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index e395ef620888c992d70b9efa6ac8dd270b431a18..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7d510880b48d910cfd5c9d873643993234206eab..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index c601ec80ba7c2321811ac11a28c29afbdfb1c489..ba09bbef4c300f4e5018683930d50870a2c8cc8c
GIT binary patch
literal 27202
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
index 0e6454797144cbba3615bb3731836743d149eba1..536eb48b3bf31fdbd013a6129062a5c92bcb5e5a
GIT binary patch
literal 1305
zc$@(l1?KvRP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$yGcYrRA}DaTH96}HxR7S|9_2>6F(%z
zhCsNp3)t{CYClLVb+<IYNdg;XIPA_WJXCd8^<`#x^4AUZNF)g|k)S;Qe+GikD*zzM
zTe$-2+w2ek(q8~Tq<$a}k$NrVfS%~JNESiXYyNqD>(P$~%wM3t6>NR!rv_@HV^Fti
zMc!TwjYa_GJRX$;PtWfZK9t4=frNTm6H@Zfk^1;glh8?s&4NIB{1tk}7J=MIX5rbz
zt_MCv0!h`AH0V}9l|V^|QPL*-K}Yqy5zw<jBzMsu5>OI6yWFL>pzlsF3aZfQV!q)6
z@oA8*r5<+JkOPp{Iq>{yuf`?Gl#Fb;Hwd8dXesC->P8qdK!etMpfS<7+f+!dgmN^o
z<o;3S`SspPKe;zWKl&Kz1_Rwm|1}NCK*OW}=EZZ!)&r77cyWDi#bZ^JlFB7H^wGVH
z26)pUk%mo0=a5xPc{H(P5nkRr6bYpik^mx+FQWf@&}TG6UgRJUWXUcYIg3c<<?TcA
z;+a)akG==~A3*ms^asWX^A3=`ka%_bm=wM{VRZ9*p?`&gW0Li)o$&hZvBo{2f={R=
zG--cJ4!srrzj?HA!g9!^UsW@R6d@J)AWP=W-S_SA`y{{?QM}7xds&}?Flob@1m5hv
zr!M_uIK+8wsQmB9p?P{b|CEfBwD5NSV;cV20g9mbQRqhwf{Y40&yv8~{f}gePc5g@
zak`HQ@6VwR6q6+6+{zK}_D>Cc8it_*gnuImVWP;I6W-lFMg4?U@bTf_PC{q`l7+kb
zr<r~dYab>*KKwojy&c<iOjX3){ZmS`qeS;Kni)Pk{2>Y26LM5h=I-Iy8DP|pcCkYc
zXuWKvqOuQE0_lZW2nQyxvC7mcw10RuT}-EmgB##Q8<aVsoN)j6tfCJNu4`~QlmXNR
zxfRng7#SZ|0=@*f4sb{Z4?ectpcNt|kev9_f1w1;3X$K-vgAsjsDF#Vfeg@W&}PyJ
z0sK!gu($^nuR^Q$f#o~#`m@mT)9C8^!15c}@;mYJcO{m;FSPufx#jPTE`N7=`R4=6
zKcQLv8QJnrDVKjvy!?~;<-aSj{I^w>|Gv=j-`HCIJ9EcpH@57|^U&l!>BkjwW3pXJ
zop(*??}Ml91DF#Ki(Ul$c6vSfl{4>#&BlA!31(}?5S5Nkgg3%4idr`}^v&7)dU~bi
z40RJmO&GU=ARsylp{v=zi&?oMkJ%>BXHpF4A;PaGS4e0a{P+p$W2++&W;O7gzy?1u
z@D$t_S5O-X1qVAVp%p3~om>`3k%PY}G#c2JpEycHCq(tnrl7$F&DHkSkVg*zzZ_pM
zGH`Zv%ZzVfld-zhQf`gSz8Q;QF}5?64aTa9vMdY#IKGIXWoH6g`W+2#g5Cod#-P}P
zeN(XQth?DK!kfGO)=&BSw{!a8CTw5ycP0FKztP1=zSsgLy-cCEWb}prt0y>z0Q~jy
zk(YvQy#^$`Ve3DS4ImWKZ3T7YR!yQyS+sWGV+05Am(NEX&jfAoYoy`B%{Sio5?@an
zIR|}kwr5m_Kz{n|OV|<>XHP}{i=|;sXe-aFBsBIdBdx(rpkoNU-#>o>gLgIOM-nAZ
P00000NkvXXu0mjfzO{A0
index 05e66d735511e57e87eb2e6af1db9984a2a0db43..2c2a04dc47547058dfa3ae19d0dfed6e2c17a70c
GIT binary patch
literal 1029
zc$|GxPiWIn9F9(KP6tx(usP+C&5PLl>(bC{ab1(v70oDJ!JcGk^0tO9c`<og(+M&~
zk=?xb=cFk9IS8WQMLoEih#vIj#T`|UF$6DyqA%TAMd=<SdB5NLzVH3s?|oS=Odjj)
z>F=Q^sy9EO70EXpJ>A>M`_S%>%M{f`+odut>nCIrIgDYU3S>gZqoOf77J7zRgBVoc
ztnDiF`tuhwuq}l?De9c=sjzBKEc$S2ak6AC*36Vej~xZ0p-coEhz$@rb8aAq3f<I|
z$vjH4G-yI_O`*r51yI%tKt(<TBE!W^F3Eu;&+v(1Ns^8Lf#W%r6Ifn|^OBqpWR3%y
zgC@KA){I=#a+`aRNTI73dos(`>vg7{V30q{@~KoR(h!6=LBxZGi;Xbu27@gH4F;xf
zd)P)Uh+?CH=CMN4ts^*ITh<LW+e8}1hK9%T49ETj)b*{Qj?+d5xCm#qMhB&a2iYPF
z(7bO#0w0XXo~-)Nz{oElG}r24p^7jHs>lQCln8XgwB0Cf;&olly8$*_6XrFACK<-I
zEm>40E++^{O-SZ=Udv@PDV0?@J}Idxm(7f~xEeC&9q8f~*ZRYiI&vc`Y_OqkFF-5j
zBL_5(EZd!H8SY%m2G{Cbi`bFNl496@F1nQ>?un*t+mfJdeCQIl`^45~uHl{Jm*~UU
zGM+*+xNi86+UR@UF=oll7*^x-D>zC(jl4Eqs;;iRf7QFfb?->W?*2Ob;pM&VvAvbg
z(@zGj-W(F2uJ)gz{u_f|UgPxl{cG;6>)R5KM$Uar6!z^J?%MNMeD*VToLcF>l3qV>
yd8w~_W9j~d_??SGZ%4XfRCzV?Y2ebE+PB+hV-K{%k9P|PBe8sTQhS)0KK~n#FG4~9
index daf52a6846c7e6da385ac4ed52156c57a6f21892..0c579f5856f53d20424efc1d5fc210080a920309
GIT binary patch
literal 1016
zc$@+F0|)$xP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#nn^@KRA}DqTHAKhFc6&em+QSB(-aD{
zl)?*rp<D~4(88}+JV>_pCfP}76ZO<5Cy||(ncbP)m2Eoy8i>F@D4c>o$ftRYyv~bs
zMf}Jkj$Z%}W4;*2>uDXQbv|VubxJS3g{9~@0SHR@OD_B)4g}O<q%jcSSSuXp<yDwP
zFPKQ^6K)BbJPt8>ry~JLLjf&upjTG`9h8cSWD;DS4HoYSw2~8(&A6J#Faimg&49~c
zAn-j<2Lh;DDx`!}$DZa4U~Ld}9)yZ!4bUS3bn=5qsG17j1||=49yWepG?o}3U+jkr
zoLn;#cWa_o5~|1Ewem(L&f!l4POpQ&-BsOe2&@ggLc<U!N~mWZIQ<zqC7!Nai^|n=
z^P^l({qXlfNc8$9xZ+99&cwhRTrQnkv51C4LWx1~5YR_5baoTaAtj+R;>k2@Gu}S%
zrBv89Y@j2ek3f$;g3f+99w-*m`$J#m;1|%*182Vj4}bQ9Y75XD?(t9=fG+$g@M99_
z&26oWs!IBQbwBTiavzw=Xd<9J;1!~WLC-mqN|5lt`R(9=**1LN;;9I!oCG?*Gi7ww
z;a`%3sf?cAO(u5R@D9T7CBZi1Y~r_nybJ);0Yfc%`0%SF#2!GdLOKJQKv&)d?0|v4
zF_<`H0%Zem5A5WqkD@US1h@gZ!X{?t1k$3HHlTNZgA@BbFhJ1;s*Gj=U3nJTl>sU?
z;2wAs1nOOE4+vCx*%N`iAn;`3Js{9-A85W4KZ;qX`DwK2{Xp|OviA4Ht>2Ys{=QK2
zcjlVEH`@N)>DHeQH2;LA`DbL!Kc#H`IdSt(>YIO8qWQN~ntxxY`8T$je`oIaOITYx
zMmgNawIoDshUofu9U;;4&tWa`Or^76fZ6$iJHbL1xEBbCo_z{-X!CW?#KUQ*kgq{t
zNQi(gXQ5g}0%D&Cu%QiReiqPqCB?Mf(gPU{oEkcgbg<~tEOhiSXoZx-W17I^fe|rD
z@TL*)7A7)KX$1u#rN8LtGQe)Ttav;cqIxc~LCF9pKvzN%1b`SptIMFOyDuJDF}aXR
zLxiFsx|kd&w0NMEV}&#lrqzc4)1fL+uZTxgPpV9EY>ZnjB#S-*w7NKettt$Y9XZ97
zjdwOtj&$B^r%IC=TC;=>FAfO)Y)oFOazsy_Yv(dB{YHN@Qf;pEFCD%=m_;uJ2SY$x
mmge>Y(f7twRUw9pI){HnwLTxvqu2xh0000<MNUMnLSTXlo67+J
index 0ef93455d999f16666d981cea5c6d777ae71b0ad..c6f9dafc75ed74e3f6bd4d64a1b9bb26ffd97186
GIT binary patch
literal 221
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1G^`0({AsP4HUfamqV8G)N$R3zh^ejm_E9wm2LWgPd&429r
zJ-z3%)uK<ifqxiKLBrA8%H7OMxK;*yW(i`Fd11Ra>;#vm!fEe0R~h#(3%$@YWLJ5h
zz0gTT&9L*o&w+BO2Fa~X_ZWqW9a^U`&Z{nRXtle;&CIQT(L83U3dlfDS3j3^P6<r_
D-8e_m
index e395ef620888c992d70b9efa6ac8dd270b431a18..8472b738bca21f25ea3fec6025bc13b9e8de330e
GIT binary patch
literal 1195
zc$@*N1XTNpP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$O-V#SRA}DqTHA8fFbtIP|33f^y<Y~N
zptR6Z_=55b<x&a<X#XN2PGWl{JC`%1=hPjVnZ!w9x-0KWvJ>7u{zlA9?a^G_sU3xJ
z|AgFt!r|__|IiKGiTnw!>PO;8;40yPG#7t#7x!G^S#azQ-afgSgWms(o(V#axH$r6
zeM=q`-U0)p5h#ev;J`a4R|@e2dVh=116WSO&S~&HZ~-Prql>=G<iI<xzbo{lIRx~P
z6+&kvpF}?y_;wVCh@yd54Tr$3ebNxP4$$ok45DX<xQ9ONfQVb{P$2p;i-V`ZyKk;r
zB$WqQjiB$w9(ja55P8m6SP~|IhJ+aqncz@+3)BsPA13gQLy8_`!xlQ?=8@nl9wsA2
z8w<)Q$DziDynFf+#WUc95b}sVq@kI(N12#Z)a9Zf4&oKmnt1PYk%)&`ap(<_G4Vj^
zS(*kI84cjkQ$Vj%kP{N`oh=gaR3IwQeLo<+Tj0m10;WN%ANt7GC?wuLTM$>7z=tvF
z9&$g^KLM|6n<Vp~3WB6l!TWE2wYWw(+&}tR91`@+JTwG;C(x_VSHuDwvi`lHw;cM)
z0LJZ=RU?g_Ko5E_{3}AA<uE!4H6NV+@eWSIU$JW4`0hDpnY@H`tvS_p5;_kw1OoJ_
z@UH^B<uEo0Z5ll|ztL5!it3Mz!-~X{3dy%d*aG?4=seI7h?DRD!arvcf{OU?-OZSO
zVg_9?eu~XpXee?jY6#q#E-1R0SRJb;00%Uosv|N4Is;T|*Uy-W8Uuh09Dzv#tO-A;
zXxIjP`2My<Tyfq2Ytv7fi*g-x-4lqifqMMV2-uFgtHdpV$}VVB1z4YeV3B64LFh&u
z0mz}4g4XNc0Uy_j0R1QMFbEXyf%3CZ(RHBsO8f|Vq0+n2!q)@EugD(3nz;B~iNg1V
zir<-g1bd^U?@pKgexUd_G{wIoEB-BI`R|EKe^X!lw-V)lty22;LdAcvRs1(|TgP89
zx&wY7D8pX*DGeYqkb@NX40PaNYcOTdI}>lc`l8#Olmq3af`EpS(2{i^F50~<Y~a<t
zkVfxjVDsp6(z=n>57AH>Rq^J5^glvDw4*a=6s94A-pzm`(EaTk2elxEsnAuJlh8Ad
z0JoV)G$Rvuvn*EVoryP(E`vJ<IK<y|QvtGP?OxXLXPrewn*kD$>VilG9$6*morE@C
zUNR<f+>y2`den}hq08B1A=Z^3g&x%;dTB=5&F;P-@CgGMIe^?*A+}2boricxMj{y=
zxpEfsj|qG<c>FE##*2^S#X*oUP2eMXyDn2qh$hwuqIe{@ac!WCt+!afKm7Fh2PFoT
zAw!i_V$sr1z-G*lm40qP(^Cm~wZGNdM806R_YHvyD`?#%0CrRgXZr|VdMTp=Zws{A
zT>&k|C;a5uMG{V?OtH$+h<zwvpH~M!I;2VhKv!EVnU!aA`3sCxm0Y(E0ucZJ002ov
JPDHLkV1hP_EEfO(
index 7d510880b48d910cfd5c9d873643993234206eab..8e308c5a9cfe7272bcfa1efd532207a1b84ecd59
GIT binary patch
literal 232
zc%17D@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGH$$r9IylHmNblJdl&R0hYC{G?O`
z&)mfH)S%SFl*+=BsWw1GU7jwEAsP4H-q^_7V8G)N*u3e#!4)0XiA;erWIY;n?EMd1
z|EpZM?eU&PpWX!4Frb2leq*H|ru}LYG#MGzdfRl>*Z1hmXJ}Q~aI5hZ=Mtgd4kwXC
z0q<A4{N#(!)Vxx&a3g;JP^gG+i(RMf`rq6;&jfmOP8X_p=c%X~H$(i{O^drCA<Sn%
OCVRU2xvX<aXaWFG$WDj=
index c601ec80ba7c2321811ac11a28c29afbdfb1c489..a1e551ea3753d779c610cf10e62df01e0c35e689
GIT binary patch
literal 40011
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
--- a/mobile/themes/core/jar.mn
+++ b/mobile/themes/core/jar.mn
@@ -329,22 +329,16 @@ chrome.jar:
   skin/honeycomb/images/popup-bg-hdpi.png             (honeycomb/images/popup-bg-hdpi.png)
   skin/honeycomb/images/popup-selected-item-hdpi.png  (honeycomb/images/popup-selected-item-hdpi.png)
   skin/honeycomb/images/arrowbox-up.png               (honeycomb/images/arrowbox-up.png)
   skin/honeycomb/images/arrowbox-down.png             (honeycomb/images/arrowbox-down.png)
   skin/honeycomb/images/arrowbox-horiz.png            (honeycomb/images/arrowbox-horiz.png)
   skin/honeycomb/images/dropmarker-hdpi.png           (honeycomb/images/dropmarker-hdpi.png)
   skin/honeycomb/images/ratings-18.png                (images/ratings-18.png)
   skin/honeycomb/images/favicon-default-32.png        (honeycomb/images/favicon-default-32.png)
-  skin/honeycomb/images/endcap-default-bg.png         (honeycomb/images/endcap-default-bg.png)
-  skin/honeycomb/images/endcap-active-bg.png          (honeycomb/images/endcap-active-bg.png)
-  skin/honeycomb/images/endcap-ev-default-bg.png      (honeycomb/images/endcap-ev-default-bg.png)
-  skin/honeycomb/images/endcap-ev-active-bg.png       (honeycomb/images/endcap-ev-active-bg.png)
-  skin/honeycomb/images/endcap-ssl-default-bg.png     (honeycomb/images/endcap-ssl-default-bg.png)
-  skin/honeycomb/images/endcap-ssl-active-bg.png      (honeycomb/images/endcap-ssl-active-bg.png)
   skin/honeycomb/images/throbber.png                  (honeycomb/images/throbber.png)
   skin/honeycomb/images/navigation-magnifier-30.png   (honeycomb/images/navigation-magnifier-30.png)
   skin/honeycomb/images/folder-32.png                 (honeycomb/images/folder-32.png)
   skin/honeycomb/images/stop-hdpi.png                 (honeycomb/images/stop-hdpi.png)
   skin/honeycomb/images/reload-hdpi.png               (honeycomb/images/reload-hdpi.png)
   skin/honeycomb/images/alert-addons-30.png           (honeycomb/images/alert-addons-30.png)
   skin/honeycomb/images/alert-downloads-30.png        (honeycomb/images/alert-downloads-30.png)
   skin/honeycomb/images/addons-default-hdpi.png       (honeycomb/images/addons-default-hdpi.png)
deleted file mode 100644
--- a/modules/libreg/Makefile.in
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# ***** 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.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# 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 *****
-
-DEPTH		= ../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-MODULE		= libreg
-
-DIRS		= include src
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/modules/libreg/include/Makefile.in
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# ***** 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.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# 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 *****
-
-DEPTH		= ../../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-MODULE		= libreg
-
-EXPORTS		= VerReg.h NSReg.h
-
-include $(topsrcdir)/config/rules.mk
-
deleted file mode 100644
--- a/modules/libreg/include/NSReg.h
+++ /dev/null
@@ -1,574 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.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 ***** */
-/* NSReg.h
- */
-#ifndef _NSREG_H_
-#define _NSREG_H_
-
-typedef void (*nr_RegPackCallbackFunc) (void *userData, int32 bytes, int32 totalBytes);
-
-typedef int32   REGERR;
-typedef int32   RKEY;
-typedef uint32  REGENUM;
-typedef void *  HREG;
-
-typedef struct _reginfo
-{
-   uint16  size;        /* must be initialized to sizeof(REGINFO) */
-   uint16  entryType;
-   uint32  entryLength;
-} REGINFO;
-
-#define REGERR_OK           (0)
-#define REGERR_FAIL         (1)
-#define REGERR_NOMORE       (2)
-#define REGERR_NOFIND       (3)
-#define REGERR_BADREAD      (4)
-#define REGERR_BADLOCN      (5)
-#define REGERR_PARAM        (6)
-#define REGERR_BADMAGIC     (7)
-#define REGERR_BADCHECK     (8)
-#define REGERR_NOFILE       (9)
-#define REGERR_MEMORY       (10)
-#define REGERR_BUFTOOSMALL  (11)
-#define REGERR_NAMETOOLONG  (12)
-#define REGERR_REGVERSION   (13)
-#define REGERR_DELETED      (14)
-#define REGERR_BADTYPE      (15)
-#define REGERR_NOPATH       (16)
-#define REGERR_BADNAME      (17)
-#define REGERR_READONLY     (18)
-#define REGERR_BADUTF8      (19)
-
-
-/* Total path length */
-#define MAXREGPATHLEN   (2048)
-/* Name on the path (including null terminator) */
-#define MAXREGNAMELEN   (512)
-/* Value of an entry */
-#define MAXREGVALUELEN  (0x7FFF)
-
-/* Standard keys */
-#define ROOTKEY_USERS                   (0x01)
-#define ROOTKEY_COMMON                  (0x02)
-#define ROOTKEY_CURRENT_USER            (0x03)
-#define ROOTKEY_PRIVATE                 (0x04)
-
-/* enumeration styles */
-#define REGENUM_NORMAL                  (0x00)
-#define REGENUM_CHILDREN                REGENUM_NORMAL
-#define REGENUM_DESCEND                 (0x01)
-#define REGENUM_DEPTH_FIRST             (0x02)
-
-/* entry data types */
-#define REGTYPE_ENTRY                 (0x0010)
-#define REGTYPE_ENTRY_STRING_UTF      (REGTYPE_ENTRY + 1)
-#define REGTYPE_ENTRY_INT32_ARRAY     (REGTYPE_ENTRY + 2)
-#define REGTYPE_ENTRY_BYTES           (REGTYPE_ENTRY + 3)
-#define REGTYPE_ENTRY_FILE            (REGTYPE_ENTRY + 4)
-
-#define REG_DELETE_LIST_KEY  "Mozilla/XPInstall/Delete List"
-#define REG_REPLACE_LIST_KEY "Mozilla/XPInstall/Replace List"
-#define REG_UNINSTALL_DIR    "Mozilla/XPInstall/Uninstall/"
-#define REG_REPLACE_SRCFILE  "ReplacementFile"
-#define REG_REPLACE_DESTFILE "DestinationFile"
-
-#define UNINSTALL_NAV_STR "_"
-
-
-#define UNIX_GLOBAL_FLAG     "MOZILLA_SHARED_REGISTRY"
-
-/* libreg functions are not DLLexported and may have hidden visibility */
-#define VR_INTERFACE(type)     type
-
-PR_BEGIN_EXTERN_C
-
-
-
-/* ---------------------------------------------------------------------
- * Registry API -- General
- * ---------------------------------------------------------------------
- */
-
-
-/* ---------------------------------------------------------------------
- * NR_RegSetBufferSize - Sets the file buffer size
- *
- * Parameters:
- *    hReg       - handle to opened registry
- *    bufsize    - size of the new buffer
- *
- * Output:
- * ---------------------------------------------------------------------
- *    returns the size of the buffer or -1 for err
- */
-VR_INTERFACE(int) NR_RegSetBufferSize(
-         HREG hReg,        /* handle to opened registry */
-         int  bufsize
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegOpen - Open a netscape XP registry
- *
- * Parameters:
- *    filename   - registry file to open. NULL or ""  opens the standard
- *                 local registry.
- *    hReg       - OUT: handle to opened registry
- *
- * Output:
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegOpen(
-         const char *filename, /* reg. file to open (NULL == standard registry) */
-         HREG *hReg            /* OUT: handle to opened registry */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegClose - Close a netscape XP registry
- *
- * Parameters:
- *    hReg     - handle of open registry to be closed.
- *
- * After calling this routine the handle is no longer valid
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegClose(
-         HREG hReg         /* handle of open registry to close */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegFlush - Manually flush data in a netscape XP registry
- *
- * Parameters:
- *    hReg     - handle of open registry to be flushed.
- *
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegFlush(
-         HREG hReg         /* handle of open registry to flush */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegIsWritable - Check read/write status of open registry
- *
- * Parameters:
- *    hReg     - handle of open registry to query
- * Returns:
- *    REGERR_OK if writable, REGERR_READONLY if not, possibly
- *    other errors for an invalid hReg
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegIsWritable(
-         HREG hReg         /* handle of open registry to query */
-       );
-
-VR_INTERFACE(REGERR) NR_RegPack(
-         HREG hReg,         /* handle of open registry to pack */
-         void *userData,
-         nr_RegPackCallbackFunc fn
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegSetUsername - Set the current username
- * 
- * If the current user profile name is not set then trying to use
- * HKEY_CURRENT_USER will result in an error.
- *
- * Parameters:
- *     name     - name of the current user
- *
- * Output:
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegSetUsername(
-         const char *name  /* name of current user */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegGetUniqueName
- * 
- * Returns a unique name that can be used for anonymous key/value names
- *
- * Parameters:
- *     hReg     - handle of open registry
- *     outbuf   - where to put the string
- *     buflen   - how big the buffer is
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetUniqueName(
-         HREG hReg,     /* handle of open registry */
-         char* outbuf,  /* buffer to hold key name */
-         uint32 buflen  /* size of buffer */
-       );
-
-
-/* ---------------------------------------------------------------------
- * DO NOT USE -- Will be removed 
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetUsername(
-         char **name        /* on return, an alloc'ed copy of the current user name */
-       );
-
-
-
-
-
-
-/* ---------------------------------------------------------------------
- * Registry API -- Key Management functions
- * ---------------------------------------------------------------------
- */
-
-/* ---------------------------------------------------------------------
- * NR_RegAddKey - Add a key node to the registry
- *
- * Can also be used to find an existing node for convenience.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - registry key obtained from NR_RegGetKey(),
- *               or one of the standard top-level keys
- *    path     - relative path of key to be added.  Intermediate
- *               nodes will be added if necessary.
- *    newkey   - If not null returns RKEY of new or found node
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegAddKey(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         char *path,       /* relative path of subkey to add */
-         RKEY *newKey      /* if not null returns newly created key */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegAddKeyRaw - Add a key node to the registry
- *
- *      This routine is different from NR_RegAddKey() in that it takes 
- *      a keyname rather than a path.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - registry key obtained from NR_RegGetKey(),
- *               or one of the standard top-level keys
- *    keyname  - name of key to be added. No parsing of this
- *               name happens.
- *    newkey   - if not null the RKEY of the new key is returned
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegAddKeyRaw(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         char *keyname,    /* name of key to add */
-         RKEY *newKey      /* if not null returns newly created key */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegDeleteKey - Delete the specified key
- *
- * Note that delete simply orphans blocks and makes no attempt
- * to reclaim space in the file. Use NR_RegPack()
- *
- * Cannot be used to delete keys with child keys
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - starting node RKEY, typically one of the standard ones.
- *    path     - relative path of key to delete
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegDeleteKey(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         char *path        /* relative path of subkey to delete */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegDeleteKeyRaw - Delete the specified raw key
- *
- * Note that delete simply orphans blocks and makes no attempt
- * to reclaim space in the file. Use NR_RegPack()
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY or parent to the raw key you wish to delete
- *    keyname  - name of child key to delete
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegDeleteKeyRaw(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         char *keyname     /* name subkey to delete */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegGetKey - Get the RKEY value of a node from its path
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - starting node RKEY, typically one of the standard ones.
- *    path     - relative path of key to find.  (a blank path just gives you
- *               the starting key--useful for verification, VersionRegistry)
- *    result   - if successful the RKEY of the specified sub-key
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetKey(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         const char *path, /* relative path of subkey to find */
-         RKEY *result      /* returns RKEY of specified sub-key */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegGetKeyRaw - Get the RKEY value of a node from its keyname
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - starting node RKEY, typically one of the standard ones.
- *    keyname  - keyname of key to find.  (a blank keyname just gives you
- *               the starting key--useful for verification, VersionRegistry)
- *    result   - if successful the RKEY of the specified sub-key
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetKeyRaw(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* root key */
-         char *keyname,       /* name of key to get */
-         RKEY *result      /* returns RKEY of specified sub-key */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegEnumSubkeys - Enumerate the subkey names for the specified key
- *
- * Returns REGERR_NOMORE at end of enumeration.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key to enumerate--obtain with NR_RegGetKey()
- *    eState   - enumerations state, must contain NULL to start
- *    buffer   - location to store subkey names.  Once an enumeration
- *               is started user must not modify contents since values
- *               are built using the previous contents.
- *    bufsize  - size of buffer for names
- *    style    - 0 returns direct child keys only, REGENUM_DESCEND
- *               returns entire sub-tree
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegEnumSubkeys(
-         HREG    hReg,        /* handle of open registry */
-         RKEY    key,         /* containing key */
-         REGENUM *state,      /* enum state, must be NULL to start */
-         char    *buffer,     /* buffer for entry names */
-         uint32  bufsize,     /* size of buffer */
-         uint32  style        /* 0: children only; REGENUM_DESCEND: sub-tree */
-       );
-
-
-
-/* ---------------------------------------------------------------------
- * Registry API -- Entry Management functions
- * ---------------------------------------------------------------------
- */
-
-
-/* ---------------------------------------------------------------------
- * NR_RegGetEntryInfo - Get some basic info about the entry data
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- *    info     - return: Entry info object
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetEntryInfo(
-         HREG    hReg,     /* handle of open registry */
-         RKEY    key,      /* containing key */
-         char    *name,    /* entry name */
-         REGINFO *info     /* returned entry info */
-       );
-
-       
-/* ---------------------------------------------------------------------
- * NR_RegGetEntryString - Get the UTF string value associated with the
- *                       named entry of the specified key.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- *    buffer   - destination for string
- *    bufsize  - size of buffer
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetEntryString(
-         HREG   hReg,      /* handle of open registry */
-         RKEY   key,       /* containing key */
-         const char *name, /* entry name */
-         char   *buffer,   /* buffer to hold value (UTF String) */
-         uint32 bufsize    /* length of buffer */
-       );
-
-/* ---------------------------------------------------------------------
- * NR_RegGetEntry - Get the value data associated with the
- *                  named entry of the specified key.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- *    buffer   - destination for data
- *    size     - in:  size of buffer
- *               out: size of actual data (incl. \0 term. for strings)
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegGetEntry(
-         HREG   hReg,      /* handle of open registry */
-         RKEY   key,       /* containing key */
-         char   *name,     /* entry name */
-         void   *buffer,   /* buffer to hold value */
-         uint32 *size      /* in:length of buffer */
-       );                  /* out: data length, >>includes<< null terminator*/
-
-
-/* ---------------------------------------------------------------------
- * NR_RegSetEntryString - Store a UTF-8 string value associated with the
- *                       named entry of the specified key.  Used for
- *                       both creation and update.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- *    buffer   - UTF-8 String to store
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegSetEntryString(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* containing key */
-         char *name,       /* entry name */
-         char *buffer      /* UTF String value */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegSetEntry - Store value data associated with the named entry
- *                  of the specified key.  Used for both creation and update.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- *    type     - type of data to be stored
- *    buffer   - data to store
- *    size     - length of data to store in bytes
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegSetEntry(
-         HREG   hReg,        /* handle of open registry */
-         RKEY   key,         /* containing key */
-         char   *name,       /* entry name */
-         uint16 type,        /* type of value data */
-         void   *buffer,     /* data buffer */
-         uint32 size         /* data length in bytes; incl. null term for strings */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegDeleteEntry - Delete the named entry
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    name     - name of entry
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegDeleteEntry(
-         HREG hReg,        /* handle of open registry */
-         RKEY key,         /* containing key */
-         char *name        /* value name */
-       );
-
-
-/* ---------------------------------------------------------------------
- * NR_RegEnumEntries - Enumerate the entry names for the specified key
- *
- * Returns REGERR_NOMORE at end of enumeration.
- *
- * Parameters:
- *    hReg     - handle of open registry
- *    key      - RKEY of key that contains entry--obtain with NR_RegGetKey()
- *    eState   - enumerations state, must contain NULL to start
- *    buffer   - location to store entry names
- *    bufsize  - size of buffer for names
- * ---------------------------------------------------------------------
- */
-VR_INTERFACE(REGERR) NR_RegEnumEntries(
-         HREG    hReg,        /* handle of open registry */
-         RKEY    key,         /* containing key */
-         REGENUM *state,      /* enum state, must be NULL to start */
-         char    *buffer,     /* buffer for entry names */
-         uint32  bufsize,     /* size of buffer */
-         REGINFO *info        /* optional; returns info about entry */
-       );
-
-
-VR_INTERFACE(void)      NR_ShutdownRegistry(void);
-VR_INTERFACE(REGERR)    NR_StartupRegistry(void);
-
-
-PR_END_EXTERN_C
-
-#endif   /* _NSREG_H_ */
-
-/* EOF: NSReg.h */
-
deleted file mode 100644
--- a/modules/libreg/include/VerReg.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.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 ***** */
-/* VerReg.h
- * XP Version Registry functions
- */
-#ifndef _VERREG_H_
-#define _VERREG_H_
-
-#include "NSReg.h"
-
-typedef struct _version
-{
-   int32   major;
-   int32   minor;
-   int32   release;
-   int32   build;
-   int32   check;
-} VERSION;
-
-
-/* CreateRegistry flags */
-#define CR_NEWREGISTRY 1
-
-PR_BEGIN_EXTERN_C
-/* ---------------------------------------------------------------------
- * Version Registry Operations
- * ---------------------------------------------------------------------
- */
-/* global registry operations */
-/* VR_CreateRegistry is available only in the STANDALONE_REGISTRY builds */
-VR_INTERFACE(REGERR) VR_CreateRegistry(char *installation, char *programPath, char *versionStr);
-VR_INTERFACE(REGERR) VR_SetRegDirectory(const char *path);
-VR_INTERFACE(REGERR) VR_PackRegistry(void *userData,  nr_RegPackCallbackFunc pdCallbackFunction);
-VR_INTERFACE(REGERR) VR_Close(void);
-
-/* component-level functions */
-VR_INTERFACE(REGERR) VR_Install(char *component_path, char *filepath, char *version, int bDirectory);
-VR_INTERFACE(REGERR) VR_Remove(char *component_path);
-VR_INTERFACE(REGERR) VR_InRegistry(char *path);
-VR_INTERFACE(REGERR) VR_ValidateComponent(char *path);
-VR_INTERFACE(REGERR) VR_Enum(char *component_path, REGENUM *state, char *buffer, uint32 buflen);
-
-/* dealing with parts of individual components */
-VR_INTERFACE(REGERR) VR_GetVersion(char *component_path, VERSION *result);
-VR_INTERFACE(REGERR) VR_GetPath(char *component_path, uint32 sizebuf, char *buf);
-VR_INTERFACE(REGERR) VR_SetRefCount(char *component_path, int refcount);
-VR_INTERFACE(REGERR) VR_GetRefCount(char *component_path, int *result);
-VR_INTERFACE(REGERR) VR_GetDefaultDirectory(char *component_path, uint32 sizebuf, char *buf);
-VR_INTERFACE(REGERR) VR_SetDefaultDirectory(char *component_path, char *directory);
-
-/* uninstall functions */
-VR_INTERFACE(REGERR) VR_UninstallCreateNode(char *regPackageName, char *userPackageName);
-VR_INTERFACE(REGERR) VR_UninstallAddFileToList(char *regPackageName, char *vrName);
-VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vrName);
-VR_INTERFACE(REGERR) VR_UninstallEnumSharedFiles(char *component_path, REGENUM *state, char *buffer, uint32 buflen);
-VR_INTERFACE(REGERR) VR_UninstallDeleteFileFromList(char *component_path, char *vrName);
-VR_INTERFACE(REGERR) VR_UninstallDeleteSharedFilesKey(char *regPackageName);
-VR_INTERFACE(REGERR) VR_UninstallDestroy(char *regPackageName);
-VR_INTERFACE(REGERR) VR_EnumUninstall(REGENUM *state, char* userPackageName,
-                                    int32 len1, char*regPackageName, int32 len2, XP_Bool bSharedList);
-VR_INTERFACE(REGERR) VR_GetUninstallUserName(char *regPackageName, char *outbuf, uint32 buflen);
-
-PR_END_EXTERN_C
-
-#endif   /* _VERREG_H_ */
-
-/* EOF: VerReg.h */
-
deleted file mode 100644
--- a/modules/libreg/src/Makefile.in
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# ***** 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.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# 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 *****
-
-DEPTH		= ../../..
-topsrcdir	= @top_srcdir@
-srcdir		= @srcdir@
-VPATH		= @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-include $(srcdir)/objs.mk
-
-MODULE		= libreg
-LIBRARY_NAME	= mozreg_s
-DIST_INSTALL = 1
-
-CSRCS		= $(MODULES_LIBREG_SRC_LCSRCS) nr_bufio.c
-
-BIN_SRCS	= VerReg.c reg.c vr_stubs.c
-PROGOBJS        = $(addprefix R_,$(BIN_SRCS:.c=.o))
-
-# We don't want a shared lib.  Static lib only.
-FORCE_STATIC_LIB = 1
-
-# Force use of PIC
-FORCE_USE_PIC	= 1
-
-# We do want this in the static libraries list
-EXPORT_LIBRARY = 1
-
-USE_STATIC_LIBS = 1
-
-SDK_LIBRARY = $(LIBRARY)
-
-include $(topsrcdir)/config/config.mk
-
-DEFINES         += -DUSE_BUFFERED_REGISTRY_IO	
-
-include $(topsrcdir)/config/rules.mk
-
-R_%.o: %.c
-	$(CC) $(OUTOPTION)$@ -c $(COMPILE_CFLAGS) -DSTANDALONE_REGISTRY $<
-
-ifdef _MSC_VER
-# Don't include directives about which CRT to use
-OS_COMPILE_CXXFLAGS += -Zl
-OS_COMPILE_CFLAGS += -Zl
-DEFINES += -D_USE_ANSI_CPP
-endif
deleted file mode 100644
--- a/modules/libreg/src/VerReg.c
+++ /dev/null
@@ -1,1766 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.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 ***** */
-/* ====================================================================
- * VerReg.c
- * XP Version Registry functions (prototype)
- * ====================================================================
- */
-
-/* --------------------------------------------------------------------
- * Install 'Navigator' produces a tree of:
- *
- *      /Components/Netscape/Web/Navigator/
- *              ...Path="c:\netscape\program\netscape.exe"
- *              ...Version=4.0.0.0
- *
- * --------------------------------------------------------------------
- */
-#include <fcntl.h>
-#include <errno.h>
-
-#if defined(XP_WIN) 
-#include <io.h>
-#endif
-
-#if defined(XP_OS2)
-#include <sys/types.h>
-#include <sys/stat.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-
-#ifdef STANDALONE_REGISTRY
-#include <stdlib.h>
-#include <assert.h>
-#endif /*STANDALONE_REGISTRY*/
-
-#include "reg.h"
-#include "NSReg.h"
-#include "VerReg.h"
-
-/* -------- local defines --------------- 
-*/
-#define MAXREGVERLEN 32     /* Version=12345.12345.12345.12345 */
-
-#define VERSTR          "Version"
-#define CHKSTR          "Check"
-#define PATHSTR         "Path"
-#define DIRSTR          "Directory"
-#define NAVHOME         "InstallDir"
-#define REFCSTR         "RefCount"
-#define SHAREDSTR       "Shared"
-#define PACKAGENAMESTR  "PackageName"
-#define SHAREDFILESSTR  "/Shared Files"
-
-#define VERSION_NAME    "Mozilla"
-#define NAVIGATOR_NODE  "/mozilla.org"
-#define CURRENT_VER     "CurrentVersion"
-
-#define PATH_ROOT(p)   ( ((p) && *(p)==PATHDEL) ? ROOTKEY_VERSIONS : curver )
-#define UNIX_ROOT(p)   ( ((p) && *(p)==PATHDEL) ? ROOTKEY_VERSIONS : unixver )
-
- 
-/* ---------------------------------------------------------------------
- * Global variables
- * ---------------------------------------------------------------------
- */
-static int isInited = 0;
-static RKEY curver = 0;
-static char gCurstr[MAXREGNAMELEN];
-
-static HREG vreg = 0;
-
-static char *app_dir = NULL;
-
-char *verRegName = NULL;
-
-
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-/* Extra Unix variables to deal with two registries 
- *   "vreg" is always the writable registry.
- *   If "vreg" is the local registry then "unixreg" will
- *   be the global registry read-only (unless we couldn't
- *   open it).
- */
-#if !defined(STANDALONE_REGISTRY)
-static HREG unixreg = 0;
-static RKEY unixver = 0;
-#endif
-XP_Bool bGlobalRegistry = FALSE;
-#endif
-
-#ifndef STANDALONE_REGISTRY
-PRLock *vr_lock = NULL;
-#endif
-
-
-/* ---------------------------------------------------------------------
- * local functions
- * ---------------------------------------------------------------------
- */
-static REGERR vr_Init(void);
-static XP_Bool vr_CompareDirs( char *dir1, char *dir2 );
-static REGERR vr_SetCurrentNav( char *product, char *programPath, char *versionStr);
-static REGERR vr_ParseVersion(char *verstr, VERSION *result);
-
-#ifdef USE_CHECKSUM
-static REGERR vr_GetCheck(char *path, int32 *check);
-#endif
-
-static REGERR vr_SetPathname(HREG reg, RKEY key, char *entry, char *dir);
-static REGERR vr_GetPathname(HREG reg, RKEY key, char *entry, char *buf, uint32 sizebuf);
-
-static REGERR vr_FindKey(char *name, HREG *hreg, RKEY *key);
-
-static REGERR vr_GetUninstallItemPath(char *regPackageName, char *regbuf, uint32 regbuflen);
-static REGERR vr_convertPackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength);
-static REGERR vr_unmanglePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength);
-
-/* --------------------------------------------------------------------- */
-
-static REGERR vr_Init(void)
-{
-
-    REGERR  err = REGERR_OK;
-    char    *regname = vr_findVerRegName();
-#if defined(XP_UNIX) && !defined(XP_MACOSX) || defined(STANDALONE_REGISTRY)
-    char    curstr[MAXREGNAMELEN];
-    RKEY    navKey;
-#endif
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-    char    *regbuf = NULL;
-#endif
-
-#ifndef STANDALONE_REGISTRY
-    if (vr_lock == NULL)
-        return REGERR_FAIL;
-#endif
-    PR_Lock(vr_lock);
-
-    if (!isInited)
-    {
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-        /* need browser directory to find the correct registry */
-        if (app_dir != NULL) {
-            regbuf = (char*)XP_ALLOC( 10 + XP_STRLEN(app_dir) );
-            if (regbuf != NULL ) {
-                XP_STRCPY( regbuf, app_dir );
-                XP_STRCAT( regbuf, "/registry" );
-            } 
-            else {
-                err = REGERR_MEMORY;
-            }
-        } 
-        if ( err != REGERR_OK )
-            goto done;
-
-        if (bGlobalRegistry) 
-            regname = regbuf;
-#endif
-
-        /* Open version registry */
-        err = NR_RegOpen( regname, &vreg );
-
-#ifndef STANDALONE_REGISTRY
-        if (err == REGERR_OK) 
-        {
-            /* find/set the current nav node */
-            err = vr_SetCurrentNav( VERSION_NAME, app_dir, NULL );
-            if ( REGERR_OK != err ) {
-                /* couldn't find or set current nav -- big problems! */
-                NR_RegClose( vreg );
-                goto done;
-            }
-        }
-
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-        /* try to open shared Unix registry, but not an error if you can't */
-        unixreg = NULL;
-        if (!bGlobalRegistry && err == REGERR_OK ) {
-            unixver = 0;
-            if (NR_RegOpen( regbuf, &unixreg ) == REGERR_OK) {
-                if (NR_RegGetKey( unixreg, ROOTKEY_VERSIONS, NAVIGATOR_NODE, 
-                    &navKey) == REGERR_OK) 
-                {
-                    if (NR_RegGetEntryString( unixreg, navKey, CURRENT_VER,
-                        curstr, sizeof(curstr)) == REGERR_OK ) 
-                    {
-                        NR_RegGetKey( unixreg, navKey, curstr, &unixver );
-                    }
-                }
-            }
-        }
-#endif
-
-        if (err == REGERR_OK) {
-            /* successfully opened! */
-            isInited = 1;
-        }
-        goto done;
-#else
-        if (err != REGERR_OK)
-            goto done;
-
-        /* Determine 'curver' key and ensure correct structure by adding */
-
-        /* ...find top-level "Navigator" node (add if missing) */
-        err = NR_RegAddKey( vreg, ROOTKEY_VERSIONS, NAVIGATOR_NODE, &navKey );
-        if (err != REGERR_OK)
-            goto done;
-
-        /* ...look for "Current Version" entry */
-        err = NR_RegGetEntryString( vreg, navKey, CURRENT_VER, curstr,
-                                    sizeof(curstr) );
-        if ( err == REGERR_NOFIND ) {
-            /* If not found create one with the built-in version */
-            err = NR_RegSetEntryString( vreg, navKey, CURRENT_VER, VERSION_NAME );
-            XP_STRCPY( curstr, VERSION_NAME );
-        }
-        if ( err != REGERR_OK )
-            goto done;
-
-        /* ...look for "curstr" child key of the navigator node */
-        err = NR_RegAddKey( vreg, navKey, curstr, &curver );
-
-        if (err == REGERR_OK) {
-            /* successfully opened! */
-            isInited = 1;
-        }
-#endif
-    }
-
-done:
-    PR_Unlock(vr_lock);
-#if defined(XP_UNIX) && !defined(XP_MACOSX) && !defined(STANDALONE_REGISTRY)
-    XP_FREEIF(regbuf);
-#endif
-    return err;
-
-}   /* Init */
-
-
-
-#if defined(XP_WIN) || defined(XP_OS2)
-#define VR_FILE_SEP '\\'
-#elif defined(XP_UNIX) || defined(XP_BEOS)
-#define VR_FILE_SEP '/'
-#endif
-
-static XP_Bool vr_CompareDirs( char *dir1, char *dir2 )
-{
-    int len1,len2;
-   
-    XP_ASSERT( dir1 && dir2 );
-    if (!dir1 || !dir2) return FALSE;
-
-    len1 = XP_STRLEN( dir1 );
-    len2 = XP_STRLEN( dir2 );
-
-    if ( dir1[len1-1] == VR_FILE_SEP )
-        len1--;
-    if ( dir2[len2-1] == VR_FILE_SEP )
-        len2--;
-
-    if ( len1 != len2 )
-        return FALSE;
-
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-    return ( XP_STRNCMP(dir1, dir2, len1) == 0 );
-#else
-    return ( XP_STRNCASECMP(dir1, dir2, len1) == 0 );
-#endif
-}
-
-
-REGERR vr_ParseVersion(char *verstr, VERSION *result)
-{
-
-    result->major = result->minor = result->release = result->build = 0;
-    result->major = atoi(verstr);
-    while (*verstr && *verstr != '.')
-        verstr++;
-    if (*verstr)
-    {
-        verstr++;
-        result->minor = atoi(verstr);
-        while (*verstr && *verstr != '.')
-            verstr++;
-        if (*verstr)
-        {
-            verstr++;
-            result->release = atoi(verstr);
-            while (*verstr && *verstr != '.')
-                verstr++;
-            if (*verstr)
-            {
-                verstr++;
-                result->build = atoi(verstr);
-                while (*verstr && *verstr != '.')
-                    verstr++;
-            }
-        }
-    }
-
-    return REGERR_OK;
-
-}   /* ParseVersion */
-
-
-
-#ifdef USE_CHECKSUM
-#define BLKSIZ 16384
-
-static REGERR vr_GetCheck(char *path, int32 *check)
-{
-
-    int fh;
-    char *buf;
-    int actual;
-    char *p;
-    int i;
-    int chk;
-
-    XP_ASSERT(path);
-    XP_ASSERT(check);
-    
-    *check = chk = 0;
-
-#ifdef NEED_XP_FIXES
-    /* open file for read */
-    fh = open(path, O_RDONLY| O_BINARY);
-    if (fh < 0)
-    {
-        switch (errno)
-        { 
-        case ENOENT:    /* file not found */
-            return REGERR_NOFILE;
-
-        case EACCES:    /* file in use */
-        
-#ifdef EMFILE        
-        case EMFILE:    /* too many files open */
-#endif
-        default:
-            return REGERR_FAIL;
-        }
-    }
-
-    buf = malloc(BLKSIZ);
-    if (!buf)
-    {
-        close(fh);
-        return REGERR_MEMORY;
-    }
-
-    do
-    {
-        /* read a block */
-        actual = read(fh, buf, BLKSIZ);
-        /* add to checksum */
-        for (p=buf, i=0; i<actual; i++, p++)
-            chk += *p;
-
-        /* if the block was partial, we're done, else loop */
-    } while (actual == BLKSIZ);
-
-    /* close file */
-    close(fh);
-    free(buf);
-#endif
-
-    /* return calculated checksum */
-    *check = chk;
-
-    return REGERR_OK;
-
-}   /* GetCheck */
-
-#endif /* USE_CHECKSUM */
-
-
-
-static REGERR vr_SetPathname(HREG reg, RKEY key, char *entry, char *dir)
-{
-    REGERR err;
-    int32  datalen = XP_STRLEN(dir)+1; /* include '\0' */
-
-    err = NR_RegSetEntry( reg, key, entry, REGTYPE_ENTRY_FILE, dir, datalen);
-
-    return err;
-}
-
-
-
-static REGERR vr_GetPathname(HREG reg, RKEY key, char *entry, char *buf, uint32 sizebuf)
-{
-    return NR_RegGetEntry( reg, key, entry, (void*)buf, &sizebuf );
-}
-
-
-
-/* create default tree with 'installation' under Navigator */
-/* set Current to the installation string */
-static REGERR vr_SetCurrentNav( char *installation, char *programPath, char *versionStr)
-{
-    REGERR      err;
-    REGENUM     state;
-    RKEY        navKey;
-    int         bFound;
-    int         nCopy;
-    char        regname[MAXREGNAMELEN];
-    char        dirbuf[MAXREGNAMELEN];
-
-    XP_ASSERT( installation ); /* required */
-    XP_ASSERT( programPath );  /* required */
-    if ( !installation || !programPath )
-        return REGERR_PARAM;
-
-    err = NR_RegAddKey( vreg, ROOTKEY_VERSIONS, NAVIGATOR_NODE, &navKey );
-    if (err != REGERR_OK)
-        goto done;
-
-    /* ...look for "Current Version" entry */
-    err = NR_RegGetEntryString( vreg, navKey, CURRENT_VER, gCurstr, sizeof(gCurstr));
-    if ( err == REGERR_NOFIND )
-    {
-        /* No current installation, we can simply add a new one  */
-        err = NR_RegAddKey( vreg, navKey, installation, &curver );
-
-        /* ... add Path and Version properties */
-        if ( err == REGERR_OK ) 
-        {
-            err = vr_SetPathname( vreg, curver, NAVHOME, programPath );
-            if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0')
-            {
-                err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr );
-            }
-        }
-
-        if ( REGERR_OK == err ) {
-            /* successfully added, make it the current version */
-            err = NR_RegSetEntryString(vreg, navKey, CURRENT_VER, installation);
-        }
-
-        if (err != REGERR_OK)
-            goto done;
-    }
-    else if ( REGERR_OK == err )
-    {
-        /* found one: if we're lucky we got the right one */
-        bFound = FALSE;
-        err = NR_RegGetKey( vreg, navKey, gCurstr, &curver );
-        if ( REGERR_OK == err ) {
-            err = vr_GetPathname( vreg, curver, NAVHOME, dirbuf, sizeof(dirbuf) );
-            if ( REGERR_OK == err ) {
-                bFound = vr_CompareDirs(dirbuf, programPath);
-            }
-            else if ( REGERR_NOFIND == err ) {
-                /* assume this is the right one since it's 'Current' */
-                err = vr_SetPathname( vreg, curver, NAVHOME, programPath );
-                bFound = TRUE;
-            }
-        }
-        
-        /* Look for an existing installation if not found */
-        state = 0;
-        while (!bFound && ((err == REGERR_OK) || (err == REGERR_NOFILE)) ) {
-            err = NR_RegEnumSubkeys( vreg, navKey, &state, gCurstr,
-                    sizeof(gCurstr), REGENUM_NORMAL );
-
-            if (REGERR_OK == err ) {
-                err = vr_GetPathname( vreg, state, NAVHOME, dirbuf, sizeof(dirbuf) );
-                if (REGERR_OK == err ) {
-                    if (vr_CompareDirs( dirbuf, programPath )) {
-                        bFound = TRUE;
-                        curver = (RKEY)state;
-                    }
-                }
-                else if ( err == REGERR_NOFIND ) {
-                    /* wasn't a navigator node */
-                    err = REGERR_OK;
-                }
-            }
-        }
-
-        /* found the right one, make it current */
-        if (bFound) {
-            err = NR_RegSetEntryString( vreg, navKey, CURRENT_VER, gCurstr );
-            /* update version (curver already set) */
-            if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0' ) {
-                err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr );
-            }
-        }
-        /* otherwise if no current installation matches */
-        else if ( err == REGERR_NOMORE )
-        {
-            /* look for an empty slot to put new installation */
-            nCopy = 1;
-            XP_STRCPY( regname, installation );
-            do {
-                err = NR_RegGetKey( vreg, navKey, regname, &curver );
-                if (err == REGERR_OK) {
-                    nCopy++;
-                    sprintf( regname, "%s #%d", installation, nCopy );
-                }
-            } while (err==REGERR_OK);
-
-            if (err != REGERR_NOFIND)
-                goto done;  /* real error, bail */
-
-            /* found an unused name -- add it */
-            err = NR_RegAddKey( vreg, navKey, regname, &curver );
-            if ( err != REGERR_OK )
-                goto done;
-
-            /* add path and version properties */
-            err = vr_SetPathname( vreg, curver, NAVHOME, programPath );
-            if ( REGERR_OK == err && versionStr != NULL && *versionStr != '\0' ) {
-                err = NR_RegSetEntryString( vreg, curver, VERSTR, versionStr );
-            }
-
-            if ( REGERR_OK == err ) {
-                /* everything's OK, make it current */
-                err = NR_RegSetEntryString(vreg,navKey,CURRENT_VER,regname);
-            }
-        }
-    }
-done:
-    return err;
-}
-
-
-
-
-/* assumes registries are open (only use after vr_Init() returns OK).
- * For UNIX look first in the global, then in the local if not found
- * -- returns both hreg and key of the named node (if found)
- */
-static REGERR vr_FindKey(char *component_path, HREG *hreg, RKEY *key)
-{
-    REGERR err = REGERR_NOFIND;
-    RKEY rootkey;
-
-#if !defined(STANDALONE_REGISTRY) && defined(XP_UNIX) && !defined(XP_MACOSX)
-    if (unixreg != NULL) {
-        *hreg = unixreg;
-        rootkey = UNIX_ROOT(component_path);
-        if (rootkey)
-            err = NR_RegGetKey( *hreg, rootkey, component_path, key );
-        else
-            err = REGERR_NOFIND;
-    }
-    if (unixreg == NULL || err == REGERR_NOFIND ) 
-#endif
-    {
-        *hreg = vreg;
-        rootkey = PATH_ROOT(component_path);
-        if (rootkey)
-            err = NR_RegGetKey( *hreg, rootkey, component_path, key );
-        else
-            err = REGERR_NOFIND;
-    }
-
-    return err;
-}
-
-
-
-/* ---------------------------------------------------------------------
- * Interface
- * ---------------------------------------------------------------------
- */
-
-#ifndef STANDALONE_REGISTRY
-VR_INTERFACE(REGERR) VR_PackRegistry(void *userData, nr_RegPackCallbackFunc fn)
-{
-    REGERR err;
-
-    /* make sure vreg (src) is open */
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegPack( vreg, userData, fn );
-
-    return err;
-
-}   /* PackRegistry */
-#endif /* STANDALONE_REGISTRY */
-
-
-VR_INTERFACE(REGERR) VR_CreateRegistry( char *installation, char *programPath, char *versionStr )
-{
-    REGERR      err;
-    char *      regname = vr_findVerRegName();
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-    char *      regbuf = NULL;
-#endif
-
-    if ( installation == NULL || *installation == '\0' )
-        return REGERR_PARAM;
-
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-#ifndef STANDALONE_REGISTRY
-    if (bGlobalRegistry)
-#endif 
-    {
-        regbuf = (char*)XP_ALLOC( 10 + XP_STRLEN(programPath) );
-        if (regbuf == NULL) 
-            return REGERR_MEMORY;
-
-        XP_STRCPY( regbuf, programPath );
-        XP_STRCAT( regbuf, "registry" );
-        regname = regbuf;
-    }
-#endif /* XP_UNIX */
-
-    PR_Lock(vr_lock);
-
-    /* automatically creates it if not found */
-    err = NR_RegOpen( regname, &vreg );
-    if (err == REGERR_OK) 
-    {
-        /* create default tree with 'installation' under Navigator */
-        /* set Current to the installation string */
-
-        err = vr_SetCurrentNav( installation, programPath, versionStr );
-
-        if ( REGERR_OK == err )
-            isInited = 1;
-        else
-            NR_RegClose( vreg );
-    }
-
-    PR_Unlock(vr_lock);
-
-#if defined(XP_UNIX) && !defined(XP_MACOSX)
-    XP_FREEIF( regbuf );
-#endif
-    return err;
-
-}   /* CreateRegistry */
-
-
-VR_INTERFACE(REGERR) VR_Close(void)
-{
-    REGERR err = REGERR_OK;
-
-#ifndef STANDALONE_REGISTRY
-    if (vr_lock == NULL)
-        return REGERR_FAIL;
-#endif
-
-    PR_Lock(vr_lock);
-
-    if (isInited) {
-#if !defined(STANDALONE_REGISTRY) && defined(XP_UNIX) && !defined(XP_MACOSX)
-        if ( unixreg != NULL )
-            NR_RegClose( unixreg );
-#endif
-        err = NR_RegClose( vreg );
-        isInited = 0;
-    }
-
-    PR_Unlock(vr_lock);
-
-    return err;
-}   /* Close */
-
-
-
-VR_INTERFACE(REGERR) VR_GetVersion(char *component_path, VERSION *result)
-{
-    REGERR  err;
-    RKEY    key;
-    HREG    hreg;
-    VERSION ver;
-    char    buf[MAXREGNAMELEN];
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    hreg = vreg;
-
-    err = vr_FindKey( component_path, &hreg, &key );
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegGetEntryString( hreg, key, VERSTR, buf, sizeof(buf) );
-    if (err != REGERR_OK)
-        return err;
-
-    vr_ParseVersion(buf, &ver);
-
-    memcpy(result, &ver, sizeof(VERSION));
-
-    return REGERR_OK;
-
-}   /* GetVersion */
-
-
-
-VR_INTERFACE(REGERR) VR_GetPath(char *component_path, uint32 sizebuf, char *buf)
-{
-    REGERR err;
-    RKEY key;
-    HREG hreg;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    hreg = vreg;
-
-    err = vr_FindKey( component_path, &hreg, &key );
-    if (err != REGERR_OK)
-        return err;
-    
-    err = vr_GetPathname( hreg, key, PATHSTR, buf, sizebuf );
-
-    return err;
-
-}   /* GetPath */
-
-
-
-VR_INTERFACE(REGERR) VR_SetDefaultDirectory(char *component_path, char *directory)
-{
-    REGERR err;
-    RKEY rootkey;
-    RKEY key;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    rootkey = PATH_ROOT(component_path);
-
-    err = NR_RegGetKey( vreg, rootkey, component_path, &key );
-    if (err != REGERR_OK)
-        return err;
-    
-    err = vr_SetPathname( vreg, key, DIRSTR, directory );
-
-    return err;
-}
-
-
-
-VR_INTERFACE(REGERR) VR_GetDefaultDirectory(char *component_path, uint32 sizebuf, char *buf)
-{
-    REGERR err;
-    RKEY key;
-    HREG hreg;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    hreg = vreg;
-
-    err = vr_FindKey( component_path, &hreg, &key );
-    if (err != REGERR_OK)
-        return err;
-
-    err = vr_GetPathname( hreg, key, DIRSTR, buf, sizebuf );
-
-    return err;
-}
-
-
-
-VR_INTERFACE(REGERR) VR_Install(char *component_path, char *filepath, char *version, int bDirectory)
-{
-    REGERR err;
-    RKEY rootKey;
-    RKEY key;
-
-    /* Initialize the registry in case this is first call */
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    /* Use curver if path is relative */
-    rootKey = PATH_ROOT(component_path);
-
-    /* Make sure path components (keys) exist by calling Add */
-    /* (special "" component must always exist, and Add fails) */
-    if ( component_path != NULL && *component_path == '\0' ) {
-        err = NR_RegGetKey( vreg, rootKey, component_path, &key );
-    }
-    else {
-        err = NR_RegAddKey( vreg, rootKey, component_path, &key );
-    }
-    if (err != REGERR_OK)
-        return err;
-
-    if ( version != NULL && *version != '\0' ) {
-        /* Add "Version" entry with values like "4.0.0.0" */
-        err = NR_RegSetEntryString( vreg, key, VERSTR, version );
-        if (err != REGERR_OK)
-            goto abort;
-    }
-
-    if ( filepath != NULL && *filepath != '\0' ) {
-        /* add "Path" entry */
-        err = vr_SetPathname( vreg, key, (bDirectory)?DIRSTR:PATHSTR, filepath );
-
-        if (err != REGERR_OK)
-            goto abort;
-    }
-
-    return REGERR_OK;
-
-abort:
-    NR_RegDeleteKey( vreg, rootKey, component_path );
-    return err;
-
-}   /* Install */
-
-
-
-VR_INTERFACE(REGERR) VR_Remove(char *component_path)
-{
-    REGERR err;
-    RKEY rootkey;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    rootkey = PATH_ROOT(component_path);
-
-    return NR_RegDeleteKey( vreg, rootkey, component_path );
-
-}   /* Remove */
-
-VR_INTERFACE(REGERR) VR_Enum(char *component_path, REGENUM *state, 
-                                         char *buffer, uint32 buflen)
-{
-    REGERR  err;
-    RKEY    rootkey;
-    RKEY    key;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( component_path == NULL )
-        rootkey = ROOTKEY_VERSIONS;
-    else
-        rootkey = PATH_ROOT(component_path);
-
-    err = NR_RegGetKey( vreg, rootkey, component_path, &key );
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegEnumSubkeys( vreg, key, state, buffer, buflen, REGENUM_DEPTH_FIRST);
-
-    return err;
-
-}   /* Enum */
-
-VR_INTERFACE(REGERR) VR_InRegistry(char *component_path)
-{
-    REGERR err;
-    RKEY key;
-    HREG hreg;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    return vr_FindKey( component_path, &hreg, &key );
-}   /* InRegistry */
-
-
-
-VR_INTERFACE(REGERR) VR_ValidateComponent(char *component_path)
-{
-    REGERR err;
-    RKEY key;
-    char path[MAXREGPATHLEN];
-    HREG hreg;
-
-
-#ifdef USE_CHECKSUM
-    char buf[MAXREGNAMELEN];
-    long calculatedCheck;
-    int storedCheck;
-#endif
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    err = vr_FindKey( component_path, &hreg, &key );
-    if ( err != REGERR_OK )
-        return err;
-
-    err = VR_GetPath( component_path, sizeof(path), path );
-    if ( err != REGERR_OK ) {
-        if ( err == REGERR_NOFIND ) {
-            err = REGERR_NOPATH;
-        }
-        return err;
-    }
-
-    {
-        uint32 len;
-        struct stat  statStruct;
-
-        /* directories are stored with a trailing separator -- if we */
-        /* have one of these we have to remove it for stat to work */
-        len = strlen(path);
-        if ( path[len-1] == VR_FILE_SEP )
-            path[len-1] = 0;
-
-        if ( stat ( path, &statStruct ) != 0 ) {
-            err = REGERR_NOFILE;
-        }
-    }
-    if (err != REGERR_OK)
-        return err;
-
-
-#if defined(USE_CHECKSUM) && !defined(XP_UNIX)
-    err = NR_RegGetEntryString( vreg, key, CHKSTR, buf, sizeof(buf) );
-    if (err != REGERR_OK)
-        return err;
-
-    storedCheck = atoi(buf);
-
-    err = vr_GetCheck(filepath, &calculatedCheck);
-    if (err != REGERR_OK)
-        return err;
-
-    if (storedCheck != calculatedCheck)
-    {
-        return REGERR_BADCHECK;
-    }
-#endif /* USE_CHECKSUM */
-
-    return REGERR_OK;
-
-}   /* CheckEntry */
-
-
-
-VR_INTERFACE(REGERR) VR_SetRegDirectory(const char *path)
-{
-    char *tmp;
-
-    tmp = XP_STRDUP(path);
-    if (NULL == tmp) {
-        return REGERR_MEMORY;
-    }
-
-    PR_Lock(vr_lock);
-
-    XP_FREEIF(app_dir);
-    app_dir = tmp;
-    
-    PR_Unlock(vr_lock);
-
-    return REGERR_OK;
-}
-
-
-
-VR_INTERFACE(REGERR) VR_SetRefCount(char *component_path, int refcount)
-{
-    REGERR err;
-    RKEY rootKey;
-    RKEY key = 0;
-    char rcstr[MAXREGNAMELEN];
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    /* Use curver if path is relative */
-    rootKey = PATH_ROOT(component_path);
-
-    /* Make sure path components (keys) exist by calling Add */
-    /* (special "" component must always exist, and Add fails) */
-    if ( component_path != NULL && *component_path == '\0' ) {
-        err = REGERR_PARAM;
-    }
-    else {
-        err = NR_RegAddKey( vreg, rootKey, component_path, &key );
-    }
-    
-    if (err != REGERR_OK)
-        return err;
-
-    *rcstr = '\0';
-    /* itoa(refcount, rcstr, 10); */
-    XP_SPRINTF(rcstr, "%d", refcount);
-    
-    if ( rcstr != NULL && *rcstr != '\0' ) {
-        /* Add "RefCount" */
-        err = NR_RegSetEntryString( vreg, key, REFCSTR, rcstr );
-    }
-    
-    return err;
-}   /* SetRefCount */
-
-
-
-VR_INTERFACE(REGERR) VR_GetRefCount(char *component_path, int *result)
-{
-    REGERR  err;
-    RKEY    rootkey;
-    RKEY    key;
-    char    buf[MAXREGNAMELEN];
-
-    *result = -1; 
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    /* "Uninstall" only happens in the writable registry, so no
-     * need to search the shared one on Unix using vr_FindKey()
-     */
-    rootkey = PATH_ROOT(component_path);
-    err = NR_RegGetKey( vreg, rootkey, component_path, &key );
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegGetEntryString( vreg, key, REFCSTR, buf, sizeof(buf) );
-    if (err != REGERR_OK)
-        return err;
-
-    *result = atoi( buf );
-
-    return REGERR_OK;
-
-}   /* GetRefCount */
-
-static REGERR vr_GetUninstallItemPath(char *regPackageName, char *regbuf, uint32 regbuflen)
-{
-    XP_Bool bSharedUninstall = FALSE;
-    XP_Bool bNavPackage = FALSE;
-    uint32 len = 0;
-    uint32 sharedstrlen = 0;
-    uint32 curstrlen = 0;
-    uint32 curregbuflen = 0;
-
-    /* determine install type */
-    if (*regPackageName == '\0') {
-        bNavPackage = TRUE;
-    }
-    else if ( *regPackageName == PATHDEL) {
-        bSharedUninstall = TRUE;
-    }
-
-    /* create uninstall path prefix */
-    len = XP_STRLEN(REG_UNINSTALL_DIR);
-    if (len < regbuflen)
-    {
-        XP_STRCPY( regbuf, REG_UNINSTALL_DIR );
-    }
-    else
-    {
-        return REGERR_BUFTOOSMALL;
-    }
-    if (bSharedUninstall)
-    {
-        sharedstrlen = XP_STRLEN(SHAREDSTR);
-        if (sharedstrlen < (regbuflen - len))
-            XP_STRCAT( regbuf, SHAREDSTR );
-        else 
-            return REGERR_BUFTOOSMALL;
-    }
-    else
-    {
-        curstrlen = XP_STRLEN(gCurstr);
-        if (curstrlen < (regbuflen - len))
-            XP_STRCAT( regbuf, gCurstr );
-        else 
-            return REGERR_BUFTOOSMALL;
-        if (1 < (regbuflen - len - curstrlen))
-            XP_STRCAT( regbuf, "/" );
-        else 
-            return REGERR_BUFTOOSMALL;
-    }  
-
-    /* add final uninstall node name */
-    len = 0;
-    curregbuflen = XP_STRLEN(regbuf);
-    if ( bNavPackage ) {
-        len = XP_STRLEN(UNINSTALL_NAV_STR);
-        if (len < (regbuflen - curregbuflen))
-            XP_STRCAT( regbuf, UNINSTALL_NAV_STR );
-        else 
-            return REGERR_BUFTOOSMALL;
-    }
-    else {
-        len = XP_STRLEN(regPackageName);
-        if (len < (regbuflen - curregbuflen))
-            XP_STRCAT( regbuf, regPackageName );
-        else 
-            return REGERR_BUFTOOSMALL;
-    }
-    return REGERR_OK;
-}
-
-
-/**
- * Replaces all '/' with '_',in the given string.If an '_' already exists in the
- * given string, it is escaped by adding another '_' to it.
- */
-static REGERR vr_convertPackageName(char *regPackageName, char *convertedPackageName, uint32 convertedDataLength)
-{
-    uint32 length = 0;
-    uint32 i;
-    uint32 j = 0;
-
-    length = XP_STRLEN(regPackageName);
-    
-    if (convertedDataLength <= length)
-        return REGERR_BUFTOOSMALL;
-
-    for (i=0, j=0; i<length; i++, j++)
-    {
-        if (j < (convertedDataLength-1))
-        {
-            convertedPackageName[j] = regPackageName[i];
-        }
-        else
-        {
-            return REGERR_BUFTOOSMALL;
-        }
-        if (regPackageName[i] == '_')
-        {
-            if ((j+1) < (convertedDataLength-1))
-            {
-                convertedPackageName[j+1] = '_';
-            }
-            else
-            {
-                return REGERR_BUFTOOSMALL;
-            }
-            j = j + 1;
-        }
-    }
-
-    if (convertedPackageName[j-1] == '/')
-        convertedPackageName[j-1] = '\0';
-    else
-    {
-        if (j < convertedDataLength)
-        {
-            convertedPackageName[j] = '\0';
-        }
-        else
-        {
-            return REGERR_BUFTOOSMALL;
-        }
-    }
-
-    length = 0;
-    length = XP_STRLEN(convertedPackageName);
-    for (i=1; i<length; i++)
-    {
-        if (convertedPackageName[i] == '/')
-            convertedPackageName[i] = '_';
-    }
-
-    return REGERR_OK;
-}
-
-static REGERR vr_unmanglePackageName(char *mangledPackageName, char *regPackageName, uint32 regPackageLength)
-{
-    uint32 length = 0;
-    uint32 i = 0;
-    uint32 j = 0;
-
-    length = XP_STRLEN(mangledPackageName);
-    
-    if (regPackageLength <= length)
-        return REGERR_BUFTOOSMALL;
-
-    while (i < length)
-    {
-        if ((mangledPackageName[i] != '_') || (i == length-1)){
-            if (j < (regPackageLength - 1))
-                regPackageName[j] = mangledPackageName[i];
-            else
-                return REGERR_BUFTOOSMALL;
-            j = j + 1;  
-            i = i + 1;
-        } else if (mangledPackageName[i + 1] != '_') { 
-            if (j < (regPackageLength - 1))
-                regPackageName[j] = '/';
-            else
-                return REGERR_BUFTOOSMALL;
-            j = j + 1;
-            i = i + 1;
-        } else {
-            if (j < (regPackageLength - 1))
-                regPackageName[j] = '_';
-            else
-                return REGERR_BUFTOOSMALL;
-            j = j + 1;
-            i = i + 2;
-        }
-    }
-    if (j < regPackageLength)
-        regPackageName[j] = '\0';
-    else
-        return REGERR_BUFTOOSMALL;
-    return REGERR_OK;
-}
-
-VR_INTERFACE(REGERR) VR_UninstallCreateNode(char *regPackageName, char *userPackageName)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf;
-    uint32 regbuflen = 0;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( regPackageName == NULL )
-        err = REGERR_PARAM;
-   
-    if ( userPackageName == NULL)
-        err = REGERR_PARAM;
-
-    regbuflen = 256 + XP_STRLEN(regPackageName);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);  
-        if (err != REGERR_OK)
-        {
-            XP_FREE(regbuf);
-            return err;
-        }
-        err = NR_RegAddKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-        XP_FREE(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-
-    if (err == REGERR_OK)
-        err = NR_RegSetEntryString(vreg, key, PACKAGENAMESTR, userPackageName);
-  
-    return err;
-
-}   /* UninstallCreateNode */
-
-VR_INTERFACE(REGERR) VR_GetUninstallUserName(char *regPackageName, char *outbuf, uint32 buflen)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf = NULL;
-    char *convertedName = NULL;
-    uint32 convertedDataLength = 0;
-    uint32 regbuflen = 0;
-
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( regPackageName == NULL || *regPackageName == '\0' || outbuf == NULL )
-        return REGERR_PARAM;
-   
-    convertedDataLength = 2 * XP_STRLEN(regPackageName) + 1;
-    convertedName = (char*)XP_ALLOC(convertedDataLength);
-    if (convertedName == NULL ) {
-        err = REGERR_MEMORY;
-        return err;
-    }
-  
-    err = vr_convertPackageName(regPackageName, convertedName, convertedDataLength);
-    if (err != REGERR_OK) {
-        XP_FREE(convertedName);
-        return err;
-    }
-    regbuflen = 256 + XP_STRLEN(convertedName);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf == NULL ) {
-        err = REGERR_MEMORY;
-    } else {
-        err = vr_GetUninstallItemPath(convertedName, regbuf, regbuflen);
-        if (err == REGERR_OK) {
-            err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-        }
-        XP_FREE(regbuf);
-    }
-
-    if (err == REGERR_OK)
-        err = NR_RegGetEntryString( vreg, key, PACKAGENAMESTR, outbuf, buflen );
-  
-    XP_FREE(convertedName);
-    return err;
-
-}   /* GetUninstallName */
-
-VR_INTERFACE(REGERR) VR_UninstallAddFileToList(char *regPackageName, char *vrName)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf;
-    uint32 regbuflen = 0;
-    uint32 curregbuflen = 0;
-    uint32 len = 0;
-    
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( regPackageName == NULL )
-        err = REGERR_PARAM;
-
-    if ( vrName == NULL )
-        err = REGERR_PARAM;
-
-    regbuflen = 256 + XP_STRLEN(regPackageName);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);
-        if (err == REGERR_OK)
-        {
-            curregbuflen = XP_STRLEN(regbuf);
-            len = XP_STRLEN(SHAREDFILESSTR);
-            if (len < (regbuflen - curregbuflen))
-            {
-                XP_STRCAT(regbuf, SHAREDFILESSTR);
-                err = NR_RegAddKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-            }
-            else
-                err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREEIF(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-
-    if (err == REGERR_OK)
-        err = NR_RegSetEntryString( vreg, key, vrName, "");
-  
-    return err;
-
-}   /* UninstallAddFileToList */
-
-VR_INTERFACE(REGERR) VR_UninstallFileExistsInList(char *regPackageName, char *vrName)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf;
-    char  sharedfilesstr[MAXREGNAMELEN];
-    uint32 regbuflen = 0;
-    uint32 curregbuflen = 0;
-    uint32 len = 0;
-    
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( regPackageName == NULL )
-        err = REGERR_PARAM;
-
-    if ( vrName == NULL )
-        err = REGERR_PARAM;
-
-    regbuflen = 256 + XP_STRLEN(regPackageName);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(regPackageName, regbuf, regbuflen);
-        if (err == REGERR_OK)
-        {
-            curregbuflen = XP_STRLEN(regbuf);
-            len = XP_STRLEN(SHAREDFILESSTR);
-            if (len < (regbuflen - curregbuflen))
-            {
-                XP_STRCAT(regbuf, SHAREDFILESSTR);
-                err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-            }
-            else
-                err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREEIF(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-    
-    if (err == REGERR_OK)
-        err = NR_RegGetEntryString( vreg, key, vrName, sharedfilesstr,
-                                    sizeof(sharedfilesstr) );
-    return err;
-
-}   /* UninstallFileExistsInList */
-
-VR_INTERFACE(REGERR) VR_UninstallEnumSharedFiles(char *component_path, REGENUM *state, 
-                                         char *buffer, uint32 buflen)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf;
-    char *converted_component_path;
-    uint32 convertedDataLength = 0;
-    uint32 regbuflen = 0;
-    uint32 curregbuflen = 0;
-    uint32 len = 0;
- 
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( component_path == NULL )
-        return REGERR_PARAM;
-
-    convertedDataLength = 2 * XP_STRLEN(component_path) + 1;
-    converted_component_path = (char*)XP_ALLOC(convertedDataLength);
-    if (converted_component_path == NULL ) {
-        err = REGERR_MEMORY;
-        return err;
-    }
-    err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
-    if (err != REGERR_OK)
-    {
-        XP_FREEIF(converted_component_path);
-        return err;
-    }
-
-    regbuflen = 256 + XP_STRLEN(converted_component_path);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(converted_component_path, regbuf, regbuflen); 
-        if (err == REGERR_OK)
-        {
-            curregbuflen = XP_STRLEN(regbuf);
-            len = XP_STRLEN(SHAREDFILESSTR);
-            if (len < (regbuflen - curregbuflen))
-            {
-                 XP_STRCAT(regbuf, SHAREDFILESSTR);
-                 err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-            }
-            else
-                err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREE(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-    
-    XP_FREE(converted_component_path);
-
-    if (err == REGERR_OK)
-        err = NR_RegEnumEntries( vreg, key, state, buffer, buflen, NULL);
-
-    return err;
-
-}   /* UninstallEnumSharedFiles */
-
-VR_INTERFACE(REGERR) VR_UninstallDeleteFileFromList(char *component_path, char *vrName)
-{
-    REGERR err;
-    RKEY key = 0;
-    char *regbuf;
-    char *converted_component_path;
-    uint32 convertedDataLength = 0;
-    uint32 regbuflen = 0;
-    uint32 curregbuflen = 0;
-    uint32 len = 0;
-        
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( component_path == NULL )
-        err = REGERR_PARAM;
-
-    if ( vrName == NULL )
-        err = REGERR_PARAM;
-
-    convertedDataLength = 2 * XP_STRLEN(component_path) + 1;
-    converted_component_path = (char*)XP_ALLOC(convertedDataLength);
-    if (converted_component_path == NULL ) {
-        err = REGERR_MEMORY;
-        return err;
-    }
-    err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
-    if (err != REGERR_OK)
-    {
-        XP_FREEIF(converted_component_path);
-        return err;
-    }
-
-    regbuflen = 256 + XP_STRLEN(converted_component_path);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(converted_component_path, regbuf, regbuflen);  
-         if (err == REGERR_OK)
-        {
-            curregbuflen = XP_STRLEN(regbuf);
-            len = XP_STRLEN(SHAREDFILESSTR);
-            if (len < (regbuflen - curregbuflen))
-            {
-                XP_STRCAT(regbuf, SHAREDFILESSTR);
-                err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-            }
-            else
-                err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREE(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-    
-    XP_FREE(converted_component_path);
-
-    if (err == REGERR_OK)
-        err = NR_RegDeleteEntry( vreg, key, vrName);
-
-    return err;
-
-}   /* UninstallDeleteFileFromList */
-
-VR_INTERFACE(REGERR) VR_UninstallDeleteSharedFilesKey(char *component_path)
-{
-    REGERR err;
-    char *regbuf;
-    char *converted_component_path;
-    uint32 convertedDataLength = 0;
-    uint32 regbuflen = 0;
-    uint32 curregbuflen = 0;
-    uint32 len = 0;
-        
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( component_path == NULL )
-        err = REGERR_PARAM;
-
-    convertedDataLength = 2 * XP_STRLEN(component_path) + 1;
-    converted_component_path = (char*)XP_ALLOC(convertedDataLength);
-    if (converted_component_path == NULL ) {
-        err = REGERR_MEMORY;
-        return err;
-    }
-    err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
-    if (err != REGERR_OK)
-    {
-        XP_FREEIF(converted_component_path);
-        return err;
-    }
-
-    regbuflen = 256 + XP_STRLEN(converted_component_path);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(converted_component_path, regbuf, regbuflen); 
-        if (err == REGERR_OK)
-        {
-            curregbuflen = XP_STRLEN(regbuf);
-            len = XP_STRLEN(SHAREDFILESSTR);
-            if (len < (regbuflen - curregbuflen))
-            {
-                XP_STRCAT(regbuf, SHAREDFILESSTR);
-                err = NR_RegDeleteKey( vreg, ROOTKEY_PRIVATE, regbuf );
-            }
-            else
-                err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREE(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-
-    XP_FREE(converted_component_path);
-    return err;
-
-}   /* UninstallDeleteSharedFilesKey */
-
-VR_INTERFACE(REGERR) VR_UninstallDestroy(char *component_path)
-{
-    REGERR err;
-    char *regbuf;
-    char *converted_component_path;
-    uint32 convertedDataLength = 0;
-    uint32 regbuflen = 0;
-        
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    if ( component_path == NULL )
-        err = REGERR_PARAM;
-    
-    convertedDataLength = 2 * XP_STRLEN(component_path) + 1;
-    converted_component_path = (char*)XP_ALLOC(convertedDataLength);
-    if (converted_component_path == NULL ) {
-        err = REGERR_MEMORY;
-        return err;
-    }
-    err = vr_convertPackageName(component_path, converted_component_path, convertedDataLength);
-    if (err != REGERR_OK)
-    {
-        XP_FREEIF(converted_component_path);
-        return err;
-    }
-
-    regbuflen = 256 + XP_STRLEN(converted_component_path);
-    regbuf = (char*)XP_ALLOC( regbuflen );
-    if (regbuf != NULL )
-    {
-        err = vr_GetUninstallItemPath(converted_component_path, regbuf, regbuflen);  
-        if (err == REGERR_OK)
-        {
-            err = NR_RegDeleteKey( vreg, ROOTKEY_PRIVATE, regbuf );
-        }
-        else
-        {
-            err = REGERR_BUFTOOSMALL;
-        }
-        XP_FREE(regbuf);
-    }
-    else
-    {
-        err = REGERR_MEMORY;
-    }
-    
-    XP_FREE(converted_component_path);
-    return err;
-
-}   /* UninstallDestroy */
-
-VR_INTERFACE(REGERR) VR_EnumUninstall(REGENUM *state, char* userPackageName,
-                                    int32 len1, char*regPackageName, int32 len2, XP_Bool bSharedList)
-{
-    REGERR err;
-    RKEY key;
-    RKEY key1;
-    char regbuf[MAXREGPATHLEN+1] = {0};
-    char temp[MAXREGPATHLEN+1] = {0};
-   
-    err = vr_Init();
-    if (err != REGERR_OK)
-        return err;
-
-    XP_STRCPY( regbuf, REG_UNINSTALL_DIR );
-    if (bSharedList)
-    {
-        XP_STRCAT( regbuf, SHAREDSTR );
-    }
-    else
-    {
-        XP_STRCAT( regbuf, gCurstr );
-    }  
-                   
-    err = NR_RegGetKey( vreg, ROOTKEY_PRIVATE, regbuf, &key );
-    if (err != REGERR_OK)
-        return err;
-
-    *regbuf = '\0';
-    *userPackageName = '\0';
-    err = NR_RegEnumSubkeys( vreg, key, state, regbuf, sizeof(regbuf), REGENUM_CHILDREN);
-
-    if (err == REGERR_OK && !bSharedList )
-    {
-        if (XP_STRCMP(regbuf, UNINSTALL_NAV_STR) == 0)
-        {
-            /* skip Communicator package, get the next one instead */
-            err = NR_RegEnumSubkeys( vreg, key, state, regbuf, sizeof(regbuf), REGENUM_CHILDREN);
-        }
-    }
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegGetKey( vreg, key, regbuf, &key1 );
-    if (err != REGERR_OK)
-        return err;
-
-    err = NR_RegGetEntryString( vreg, key1, PACKAGENAMESTR, userPackageName, len1);
-
-    if (err != REGERR_OK)
-    {
-        *userPackageName = '\0';
-        return err;
-    }
-
-    if (len2 <= (int32)XP_STRLEN(regbuf))
-    {
-        err =  REGERR_BUFTOOSMALL;
-        *userPackageName = '\0';
-        return err;
-    }
-    
-    *regPackageName = '\0';
-    if (bSharedList)
-    {
-        XP_STRCPY(temp, "/");
-        XP_STRCAT(temp, regbuf);
-        *regbuf = '\0';
-        XP_STRCPY(regbuf, temp);
-    }
-
-    err = vr_unmanglePackageName(regbuf, regPackageName, len2);
-    return err;
-
-}   /* EnumUninstall */
-
-/* EOF: VerReg.c */
deleted file mode 100644
--- a/modules/libreg/src/nr_bufio.c
+++ /dev/null
@@ -1,758 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.com>
- *   Edward Kandrot <kandrot@netscape.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 ***** */
-
-/*------------------------------------------------------------------------
- * nr_bufio
- * 
- * Buffered I/O routines to improve registry performance
- * the routines mirror fopen(), fclose() et al
- *
- * Inspired by the performance gains James L. Nance <jim_nance@yahoo.com>
- * got using NSPR memory-mapped I/O for the registry. Unfortunately NSPR 
- * doesn't support mmapio on the Mac.
- *-----------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-
-#if defined(XP_MACOSX)
-#include <Carbon/Carbon.h>
-#endif
-
-#if defined(SUNOS4)
-#include <unistd.h>  /* for SEEK_SET */
-#endif /* SUNOS4 */
-
-#include "prerror.h"
-#include "prlog.h"
-
-#include "vr_stubs.h"
-#include "nr_bufio.h"
-
-
-#define BUFIO_BUFSIZE_DEFAULT   0x2000
-
-#define STARTS_IN_BUF(f) ((f->fpos >= f->datastart) && \
-                         (f->fpos < (f->datastart+f->datasize)))
-
-#define ENDS_IN_BUF(f,c) (((f->fpos + c) > (PRUint32)f->datastart) && \
-                         ((f->fpos + c) <= (PRUint32)(f->datastart+f->datasize)))
-
-#if DEBUG_dougt
-static num_reads = 0;
-#endif
-
-
-struct BufioFileStruct 
-{
-    FILE    *fd;        /* real file descriptor */
-    PRInt32 fsize;      /* total size of file */
-    PRInt32 fpos;       /* our logical position in the file */
-    PRInt32 datastart;  /* the file position at which the buffer starts */
-    PRInt32 datasize;   /* the amount of data actually in the buffer*/
-    PRInt32 bufsize;	/* size of the in memory buffer */
-    PRBool  bufdirty;   /* whether the buffer been written to */
-    PRInt32 dirtystart;
-    PRInt32 dirtyend;
-    PRBool  readOnly;   /* whether the file allows writing or not */
-#ifdef DEBUG_dveditzbuf
-    PRUint32 reads;
-    PRUint32 writes;
-#endif
-    char    *data;      /* the data buffer */
-};
-
-
-static PRBool _bufio_loadBuf( BufioFile* file, PRUint32 count );
-static int    _bufio_flushBuf( BufioFile* file );
-
-#ifdef XP_OS2
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <share.h>
-#include <io.h>
-
-FILE* os2_fileopen(const char* name, const char* mode)
-{
-    int access = O_RDWR;
-    int descriptor;
-    int pmode = 0;
-
-    /* Fail if only one character is passed in - this shouldn't happen */
-    if (mode[1] == '\0') {
-        return NULL;
-    }
-    /* Only possible options are wb+, rb+, wb and rb */
-    if (mode[0] == 'w' && mode[1] == 'b') {
-        access |= (O_TRUNC | O_CREAT);
-        if (mode[2] == '+') {
-            access |= O_RDWR;
-            pmode = S_IREAD | S_IWRITE;
-        } else {
-            access |= O_WRONLY;
-            pmode = S_IWRITE;
-        }
-    }
-    if (mode[0] == 'r' && mode[1] == 'b') {
-        if (mode[2] == '+') {
-            access |= O_RDWR;
-            pmode = S_IREAD | S_IWRITE;
-        } else {
-            access = O_RDONLY;
-            pmode = S_IREAD;
-        }
-    }
-
-    descriptor = sopen(name, access, SH_DENYNO, pmode);
-    if (descriptor != -1) {
-        return fdopen(descriptor, mode);
-    }
-    return NULL;
-}
-#endif
-
-/** 
- * like fopen() this routine takes *native* filenames, not NSPR names.
- */
-BufioFile*  bufio_Open(const char* name, const char* mode)
-{
-    FILE        *fd;
-    BufioFile   *file = NULL;
-
-#ifdef XP_OS2
-    fd = os2_fileopen( name, mode );
-#else
-    fd = fopen( name, mode );
-#endif
-    
-    if ( fd )
-    {
-        /* file opened successfully, initialize the bufio structure */
-
-        file = PR_NEWZAP( BufioFile );
-        if ( file )
-        {
-            file->fd = fd;
-            file->bufsize = BUFIO_BUFSIZE_DEFAULT;  /* set the default buffer size */
-
-            file->data = (char*)PR_Malloc( file->bufsize );
-            if ( file->data )
-            {
-                /* get file size to finish initialization of bufio */
-                if ( !fseek( fd, 0, SEEK_END ) )
-                {
-                    file->fsize = ftell( fd );
-
-                    file->readOnly = strcmp(mode,XP_FILE_READ) == 0 || 
-                                     strcmp(mode,XP_FILE_READ_BIN) == 0;
-                }
-                else
-                {
-                    PR_Free( file->data );
-                    PR_DELETE( file );
-                }
-            }
-            else
-                PR_DELETE( file );
-        }
-
-        /* close file if we couldn't create BufioFile */
-        if (!file)
-        {
-            fclose( fd );
-            PR_SetError( PR_OUT_OF_MEMORY_ERROR, 0 );
-        }
-    }
-    else
-    {
-        /* couldn't open file. Figure out why and set NSPR errors */
-        
-        switch (errno)
-        {
-            /* file not found */
-#if defined(XP_MACOSX)
-            case fnfErr:
-#else
-            case ENOENT:
-#endif
-                PR_SetError(PR_FILE_NOT_FOUND_ERROR,0);
-                break;
-
-            /* file in use */
-#if defined(XP_MACOSX)
-            case opWrErr:
-#else
-            case EACCES:
-#endif
-                PR_SetError(PR_NO_ACCESS_RIGHTS_ERROR,0);
-                break;
-
-            default:
-                PR_SetError(PR_UNKNOWN_ERROR,0);
-                break;
-        }
-    }
-
-    return file;
-}
-
-
-
-/**
- * close the buffered file and destroy BufioFile struct
- */
-int bufio_Close(BufioFile* file)
-{
-    int retval = -1;
-
-    if ( file )
-    {
-        if ( file->bufdirty )
-            _bufio_flushBuf( file );
-
-        retval = fclose( file->fd );
-
-        if ( file->data )
-            PR_Free( file->data );
-
-        PR_DELETE( file );
-#if DEBUG_dougt
-        printf(" --- > Buffered registry read fs hits (%d)\n", num_reads);
-#endif
-    }
-
-    return retval;
-}
-
-
-
-/**
- * change the logical position in the file. Equivalent to fseek()
- */
-int bufio_Seek(BufioFile* file, PRInt32 offset, int whence)
-{
-    if (!file)
-        return -1;
-
-    switch(whence) 
-    {
-      case SEEK_SET:
-	    file->fpos = offset;
-	    break;
-	  case SEEK_END:
-	    file->fpos = file->fsize + offset;
-	    break;
-	  case SEEK_CUR:
-	    file->fpos = file->fpos + offset;
-	    break;
-	  default:
-	    return -1;
-    }
-
-    if ( file->fpos < 0 ) 
-        file->fpos = 0;
-
-    return 0;
-}
-
-
-
-/**
- * like ftell() returns the current position in the file, or -1 for error
- */
-PRInt32 bufio_Tell(BufioFile* file)
-{
-    if (file)
-        return file->fpos;
-    else
-        return -1;
-}
-
-
-
-PRUint32 bufio_Read(BufioFile* file, char* dest, PRUint32 count)
-{
-    PRInt32     startOffset;
-    PRInt32     endOffset;
-    PRInt32     leftover;
-    PRUint32    bytesCopied;
-    PRUint32    bytesRead;
-    PRUint32    retcount = 0;
-
-    /* sanity check arguments */
-    if ( !file || !dest || count == 0 || file->fpos >= file->fsize )
-        return 0;
-
-    /* Adjust amount to read if we're near EOF */
-    if ( (file->fpos + count) > (PRUint32)file->fsize )
-        count = file->fsize - file->fpos;
-
-
-    /* figure out how much of the data we want is already buffered */
-
-    startOffset = file->fpos - file->datastart;
-    endOffset = startOffset + count;
-
-    if ( startOffset >= 0 && startOffset < file->datasize )
-    {
-        /* The beginning of what we want is in the buffer  */
-        /* so copy as much as is available of what we want */
-
-        if ( endOffset <= file->datasize )
-            bytesCopied = count;
-        else
-            bytesCopied = file->datasize - startOffset;
-
-        memcpy( dest, file->data + startOffset, bytesCopied );
-        retcount = bytesCopied;
-        file->fpos += bytesCopied;
-#ifdef DEBUG_dveditzbuf
-        file->reads++;
-#endif
-
-        /* Was that all we wanted, or do we need to get more? */
-
-        leftover = count - bytesCopied;
-        PR_ASSERT( leftover >= 0 );     /* negative left? something's wrong! */
-
-        if ( leftover )
-        {
-            /* need data that's not in the buffer */
-
-            /* if what's left fits in a buffer then load the buffer with the */
-            /* new area before giving the data, otherwise just read right    */
-            /* into the user's dest buffer */
-
-            if ( _bufio_loadBuf( file, leftover ) )
-            {
-                startOffset = file->fpos - file->datastart;
-
-                /* we may not have been able to load as much as we wanted */
-                if ( startOffset > file->datasize )
-                    bytesRead = 0;
-                else if ( startOffset+leftover <= file->datasize )
-                    bytesRead = leftover;
-                else
-                    bytesRead = file->datasize - startOffset;
-
-                if ( bytesRead )
-                {
-                    memcpy( dest+bytesCopied, file->data+startOffset, bytesRead );
-                    file->fpos += bytesRead;
-                    retcount += bytesRead;
-#ifdef DEBUG_dveditzbuf
-                    file->reads++;
-#endif
-                }
-            }
-            else 
-            {
-                /* we need more than we could load into a buffer, so */
-                /* skip buffering and just read the data directly    */
-
-                if ( fseek( file->fd, file->fpos, SEEK_SET ) == 0 )
-                {
-#if DEBUG_dougt
-                    ++num_reads;
-#endif
-                    bytesRead = fread(dest+bytesCopied, 1, leftover, file->fd);
-                    file->fpos += bytesRead;
-                    retcount += bytesRead;
-                }
-                else 
-                {
-                    /* XXX seek failed, couldn't load more data -- help! */
-                    /* should we call PR_SetError() ? */
-                }
-            }
-        }
-    }
-    else
-    {
-        /* range doesn't start in the loaded buffer but it might end there */
-        if ( endOffset > 0 && endOffset <= file->datasize )
-            bytesCopied = endOffset;
-        else
-            bytesCopied = 0;
-
-        leftover = count - bytesCopied;
-
-        if ( bytesCopied )
-        {
-            /* the tail end of the range we want is already buffered */
-            /* first copy the buffered data to the dest area         */
-            memcpy( dest+leftover, file->data, bytesCopied );
-#ifdef DEBUG_dveditzbuf
-            file->reads++;
-#endif
-        }
-            
-        /* now pick up the part that's not already in the buffer */
-
-        if ( _bufio_loadBuf( file, leftover ) )
-        {
-            /* we were able to load some data */
-            startOffset = file->fpos - file->datastart;
-
-            /* we may not have been able to read as much as we wanted */
-            if ( startOffset > file->datasize )
-                bytesRead = 0;
-            else if ( startOffset+leftover <= file->datasize )
-                bytesRead = leftover;
-            else
-                bytesRead = file->datasize - startOffset;
-
-            if ( bytesRead )
-            {
-                memcpy( dest, file->data+startOffset, bytesRead );
-#ifdef DEBUG_dveditzbuf
-                file->reads++;
-#endif
-            }
-        }
-        else
-        {
-            /* leftover data doesn't fit so skip buffering */
-            if ( fseek( file->fd, file->fpos, SEEK_SET ) == 0 )
-            {
-                bytesRead = fread(dest, 1, leftover, file->fd);
-#if DEBUG_dougt
-                ++num_reads;
-#endif        
-            }
-            else
-                bytesRead = 0;
-        }
-
-        /* if we couldn't read all the leftover, don't tell caller */
-        /* about the tail end we copied from the first buffer      */
-        if ( bytesRead == (PRUint32)leftover )
-            retcount = bytesCopied + bytesRead;
-        else
-            retcount = bytesRead;
-
-        file->fpos += retcount;
-    }
-
-    return retcount;
-}
-
-
-
-/**
- * Buffered writes
- */
-PRUint32 bufio_Write(BufioFile* file, const char* src, PRUint32 count)
-{
-    const char* newsrc;
-    PRInt32  startOffset;
-    PRInt32  endOffset;
-    PRUint32 leftover;
-    PRUint32 retcount = 0;
-    PRUint32 bytesWritten = 0;
-    PRUint32 bytesCopied = 0;
-
-    /* sanity check arguments */
-    if ( !file || !src || count == 0 || file->readOnly )
-        return 0;
-
-    /* Write to the current buffer if we can, otherwise load a new buffer */
-
-    startOffset = file->fpos - file->datastart;
-    endOffset = startOffset + count;
-
-    if ( startOffset >= 0 && startOffset <  file->bufsize )
-    {
-        /* the area we want to write starts in the buffer */
-
-        if ( endOffset <= file->bufsize )
-            bytesCopied = count;
-        else
-            bytesCopied = file->bufsize - startOffset;
-
-        memcpy( file->data + startOffset, src, bytesCopied );
-        file->bufdirty = PR_TRUE;
-        endOffset = startOffset + bytesCopied;
-        file->dirtystart = PR_MIN( startOffset, file->dirtystart );
-        file->dirtyend   = PR_MAX( endOffset,   file->dirtyend );
-#ifdef DEBUG_dveditzbuf
-        file->writes++;
-#endif
-
-        if ( endOffset > file->datasize )
-            file->datasize = endOffset;
-
-        retcount = bytesCopied;
-        file->fpos += bytesCopied;
-
-        /* was that all we had to write, or is there more? */
-        leftover = count - bytesCopied;
-        newsrc = src+bytesCopied;
-    }
-    else
-    {
-        /* range doesn't start in the loaded buffer but it might end there */
-        if ( endOffset > 0 && endOffset <= file->bufsize )
-            bytesCopied = endOffset;
-        else
-            bytesCopied = 0;
-
-        leftover = count - bytesCopied;
-        newsrc = src;
-
-        if ( bytesCopied )
-        {
-            /* the tail end of the write range is already in the buffer */
-            memcpy( file->data, src+leftover, bytesCopied );
-            file->bufdirty      = PR_TRUE;
-            file->dirtystart    = 0;
-            file->dirtyend      = PR_MAX( endOffset, file->dirtyend );
-#ifdef DEBUG_dveditzbuf
-            file->writes++;
-#endif
-
-            if ( endOffset > file->datasize )
-                file->datasize = endOffset;
-        }
-    }
-
-    /* if we only wrote part of the request pick up the leftovers */
-    if ( leftover )
-    {
-        /* load the buffer with the new range, if possible */
-        if ( _bufio_loadBuf( file, leftover ) )
-        {
-            startOffset = file->fpos - file->datastart;
-            endOffset   = startOffset + leftover;
-
-            memcpy( file->data+startOffset, newsrc, leftover );
-            file->bufdirty      = PR_TRUE;
-            file->dirtystart    = startOffset;
-            file->dirtyend      = endOffset;
-#ifdef DEBUG_dveditzbuf
-            file->writes++;
-#endif
-            if ( endOffset > file->datasize )
-                file->datasize = endOffset;
-
-            bytesWritten = leftover;
-        }
-        else
-        {
-            /* request didn't fit in a buffer, write directly */
-            if ( fseek( file->fd, file->fpos, SEEK_SET ) == 0 )
-                bytesWritten = fwrite( newsrc, 1, leftover, file->fd );
-            else
-                bytesWritten = 0; /* seek failed! */
-        }
-
-        if ( retcount )
-        {
-            /* we already counted the first part we wrote */
-            retcount    += bytesWritten;
-            file->fpos  += bytesWritten;
-        }
-        else
-        {
-            retcount    = bytesCopied + bytesWritten;
-            file->fpos  += retcount;
-        }
-    }
-
-    if ( file->fpos > file->fsize )
-        file->fsize = file->fpos;
-    
-    return retcount;
-}
-
-
-
-int bufio_Flush(BufioFile* file)
-{
-    if ( file->bufdirty )
-        _bufio_flushBuf( file );
-    
-    return fflush(file->fd);
-}
-
-
-
-/*---------------------------------------------------------------------------*
- * internal helper functions
- *---------------------------------------------------------------------------*/
-/**
- * Attempts to load the buffer with the requested amount of data.
- * Returns PR_TRUE if it was able to load *some* of the requested
- * data, but not necessarily all. Returns PR_FALSE if the read fails
- * or if the requested amount wouldn't fit in the buffer.
- */
-static PRBool _bufio_loadBuf( BufioFile* file, PRUint32 count )
-{
-    PRInt32     startBuf;
-    PRInt32     endPos;
-    PRInt32     endBuf;
-    PRUint32    bytesRead;
-
-    /* no point in buffering more than the physical buffer will hold */
-    if ( count > (PRUint32)file->bufsize )
-        return PR_FALSE;
-
-    /* Is caller asking for data we already have? */
-    if ( STARTS_IN_BUF(file) && ENDS_IN_BUF(file,count) )
-    {   
-        PR_ASSERT(0);
-        return PR_TRUE;
-    }
-
-    /* if the buffer's dirty make sure we successfully flush it */
-    if ( file->bufdirty && _bufio_flushBuf(file) != 0 )
-        return PR_FALSE;
-
-    /* For now we're not trying anything smarter than simple paging. */
-    /* Slide over if necessary to fit the entire request             */
-    startBuf = ( file->fpos / file->bufsize ) * file->bufsize;
-    endPos = file->fpos + count;
-    endBuf = startBuf + file->bufsize;
-    if ( endPos > endBuf )
-        startBuf += (endPos - endBuf);
-
-    if ( fseek( file->fd, startBuf, SEEK_SET ) != 0 )
-        return PR_FALSE;
-    else
-    {
-#if DEBUG_dougt
-        ++num_reads;
-#endif
-        bytesRead = fread( file->data, 1, file->bufsize, file->fd );
-        file->datastart  = startBuf;
-        file->datasize   = bytesRead;
-        file->bufdirty   = PR_FALSE;
-        file->dirtystart = file->bufsize;
-        file->dirtyend   = 0;
-#ifdef DEBUG_dveditzbuf
-        printf("REG: buffer read %d (%d) after %d reads\n",startBuf,file->fpos,file->reads);
-        file->reads = 0;
-        file->writes = 0;
-#endif
-        return PR_TRUE;
-    }
-}
-
-
-
-static int _bufio_flushBuf( BufioFile* file )
-{
-    PRUint32 written;
-    PRUint32 dirtyamt;
-    PRInt32  startpos;
-
-    PR_ASSERT(file);
-    if ( !file || !file->bufdirty )
-        return 0;
-
-    startpos = file->datastart + file->dirtystart;
-    if ( !fseek( file->fd, startpos, SEEK_SET ) )
-    {
-        dirtyamt = file->dirtyend - file->dirtystart;
-        written = fwrite( file->data+file->dirtystart, 1, dirtyamt, file->fd );
-        if ( written == dirtyamt )
-        {
-#ifdef DEBUG_dveditzbuf
-            printf("REG: buffer flush %d - %d after %d writes\n",startpos,startpos+written,file->writes);
-            file->writes = 0;
-#endif
-            file->bufdirty   = PR_FALSE;
-            file->dirtystart = file->bufsize;
-            file->dirtyend   = 0;
-            return 0;
-        }
-    }
-    return -1;
-}
-
-
-
-/*
-*  sets the file buffer size to bufsize, clearing the buffer in the process.
-*
-*  accepts bufsize of -1 to mean default buffer size, defined by BUFIO_BUFSIZE_DEFAULT
-*  returns new buffers size, or -1 if error occurred
-*/
-
-int bufio_SetBufferSize(BufioFile* file, int bufsize)
-{
-    char    *newBuffer;
-    int     retVal = -1;
-
-    PR_ASSERT(file);
-    if (!file)
-        return retVal;
-
-    if (bufsize == -1)
-        bufsize = BUFIO_BUFSIZE_DEFAULT;
-    if (bufsize == file->bufsize)
-        return bufsize;
-
-    newBuffer = (char*)PR_Malloc( bufsize );
-    if (newBuffer)
-    {
-        /* if the buffer's dirty make sure we successfully flush it */
-        if ( file->bufdirty && _bufio_flushBuf(file) != 0 )
-        {
-            PR_Free( newBuffer );
-            return -1;
-        }
-
-
-        file->bufsize = bufsize;
-        if ( file->data )
-            PR_Free( file->data );
-        file->data = newBuffer;
-        file->datasize = 0;
-        file->datastart = 0;
-        retVal = bufsize;
-    }
- 
-    return retVal;
-}
-
-
-/* EOF nr_bufio.c */
deleted file mode 100644
--- a/modules/libreg/src/nr_bufio.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1999
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.com>
- *   Edward Kandrot <kandrot@netscape.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 ***** */
-
-/* nr_bufio.h
- * Buffered I/O routines to improve registry performance
- * 
- * the routines mirror fopen(), fclose() et al
- *
- * __NOTE__: the filenames are *native* filenames, not NSPR names.
- */
-
-#ifndef _NR_BUFIO_H_
-#define _NR_BUFIO_H_
-
-typedef struct BufioFileStruct BufioFile;
-
-BufioFile*  bufio_Open(const char* name, const char* mode);
-int         bufio_Close(BufioFile* file);
-int         bufio_Seek(BufioFile* file, PRInt32 offset, int whence);
-PRUint32    bufio_Read(BufioFile* file, char* dest, PRUint32 count);
-PRUint32    bufio_Write(BufioFile* file, const char* src, PRUint32 count);
-PRInt32     bufio_Tell(BufioFile* file);
-int         bufio_Flush(BufioFile* file);
-int         bufio_SetBufferSize(BufioFile* file, int bufsize);
-
-#endif  /* _NR_BUFIO_H_ */
-
deleted file mode 100644
--- a/modules/libreg/src/objs.mk
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# ***** 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.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2000
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-#
-# 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 *****
-
-MODULES_LIBREG_SRC_LCSRCS = \
-		reg.c \
-		VerReg.c \
-		vr_stubs.c \
-		$(NULL)
-
-
-MODULES_LIBREG_SRC_CSRCS := $(addprefix $(topsrcdir)/modules/libreg/src/, $(MODULES_LIBREG_SRC_LCSRCS))
-
-
deleted file mode 100644
--- a/modules/libreg/src/reg.c
+++ /dev/null
@@ -1,3920 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- *
- * ***** 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 Communicator client code, released
- * March 31, 1998.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *   Daniel Veditz <dveditz@netscape.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 ***** */
-/* ====================================================================
- * reg.c
- * XP Registry functions
- * ====================================================================
- */
-
-/* TODO:
- *  - Replace 'malloc' in NR_RegPack with the Netscape XP equivalent
- *  - Solve DOS 'errno' problem mentioned below
- *  - Solve rename across volume problem described in VR_PackRegistry
- */
-
-/* Preprocessor Defines
- *  STANDALONE_REGISTRY - define if not linking with Navigator
- *  NOCACHE_HDR         - define if multi-process access to registry
- *  SELF_REPAIR         - undefine to skip header update on open
- *  VERIFY_READ         - define TRUE to double-check short reads
- *
-#define NOCACHE_HDR     1
- */
-#define SELF_REPAIR     1
-#ifdef DEBUG
-#define VERIFY_READ     1
-#endif
-
-#include <stdio.h>
-#include <string.h>
-
-#ifdef XP_UNIX
-#include <limits.h>
-#endif
-
-#ifdef STANDALONE_REGISTRY
-#include <stdlib.h>
-#include <assert.h>
-#include <errno.h>
-#else
-#include "prtypes.h"
-#include "prlog.h"
-#include "prerror.h"
-#include "prprf.h"
-#endif /*STANDALONE_REGISTRY*/
-
-#if defined(SUNOS4)
-#include <unistd.h>  /* for SEEK_SET */
-#endif /* SUNOS4 */
-
-#include "reg.h"
-#include "NSReg.h"
-
-#if defined(XP_MACOSX)
-#define MAX_PATH PATH_MAX
-#elif defined(XP_UNIX)
-#ifndef MAX_PATH
-#ifdef PATH_MAX
-#define MAX_PATH PATH_MAX
-#else
-#define MAX_PATH 1024
-#endif
-#endif
-#elif defined(XP_OS2)
-#ifndef MAX_PATH
-#define MAX_PATH 260
-#endif
-#elif defined(WIN32)
-#define MAX_PATH _MAX_PATH
-#elif defined(XP_BEOS)
-#include <limits.h>
-#define MAX_PATH PATH_MAX
-#endif
-
- 
- /* NOTE! It is EXREMELY important that node names be in UTF-8; otherwise
- * backwards path search for delim char will fail for multi-byte/Unicode names
- */
-
-/* ====================================================================
- * Overview
- * --------------------------------------------------------------------
- *
- *  Layers:
- *      Interface
- *          Path Parsing
- *              Key/Entry Management
- *                  Block I/O
- *                      Virtual I/O
- *
- * The functions in this file search and add to a binary Registry file
- * quite efficiently.  So efficiently, squeezing out space left by
- * deleted and updated objects requires a separate "pack" operation.
- *
- * Terms:
- * As used here, a 'key' is a node in the tree. The root of the tree
- * exists in an otherwise empty Registry as is itself a key.  Every key
- * has 0 or more sub-keys. Every key also has 0 or more 'entry's. Both
- * entries and keys have names. Entries also have values associated.
- * Names and values are simply strings of characters. These strings
- * may be quoted so that they can include path delimiter and equals
- * sign characters which are otherwise reserved.
- * ====================================================================
- */
-
-/* --------------------------------------------------------------------
- * Module Global Data
- *
- * use of this data must be protected by the reglist lock
- * --------------------------------------------------------------------
- */
-
-#if !defined(STANDALONE_REGISTRY)
-static PRLock   *reglist_lock = NULL;
-#endif
-
-static REGFILE  *RegList = NULL;
-static int32    regStartCount = 0;
-char            *globalRegName = NULL;
-static char     *user_name = NULL;
-
-/* --------------------------------------------------------------------
- * Registry List management
- * --------------------------------------------------------------------
- */
-static void nr_AddNode(REGFILE* pReg);
-static void nr_DeleteNode(REGFILE *pReg);
-static REGFILE* vr_findRegFile(const char *filename);
-
-/* -------------------------------------------------------------------- */
-
-static void nr_AddNode(REGFILE* pReg)
-{
-    /* add node to head of list */
-    pReg->next = RegList;
-    pReg->prev = NULL;
-
-    RegList = pReg;
-
-    if ( pReg->next != NULL ) {
-        pReg->next->prev = pReg;
-    }
-}
-
-static void nr_DeleteNode(REGFILE* pReg)
-{
-    /* if at head of list... */
-    if ( pReg->prev == NULL ) {
-        RegList = pReg->next;
-    }
-    else {
-        pReg->prev->next = pReg->next;
-    }
-
-    if ( pReg->next != NULL ) {
-        pReg->next->prev = pReg->prev;
-    }
-
-    /* free memory */
-#ifndef STANDALONE_REGISTRY
-    if ( pReg->lock != NULL )
-        PR_DestroyLock( pReg->lock );
-#endif
-    XP_FREEIF( pReg->filename );
-    XP_FREE( pReg );
-}
-
-static REGFILE* vr_findRegFile(const char *filename)
-{
-    REGFILE *pReg;
-
-    pReg = RegList;
-    while( pReg != NULL ) {
-#if defined(XP_UNIX) && !defined(XP_MACOSX) || defined XP_BEOS
-        if ( 0 == XP_STRCMP( filename, pReg->filename ) ) {
-#else
-        if ( 0 == XP_STRCASECMP( filename, pReg->filename ) ) {
-#endif
-            break;
-        }
-        pReg = pReg->next;
-    }
-
-    return pReg;
-}
-
-
-/* --------------------------------------------------------------------
- * Virtual I/O
- *  Platform-specifics go in this section
- * --------------------------------------------------------------------
- */
-static REGERR nr_OpenFile(const char *path, FILEHANDLE *fh);
-static REGERR nr_CloseFile(FILEHANDLE *fh); /* Note: fh is a pointer */
-static REGERR nr_ReadFile(FILEHANDLE fh, REGOFF offset, int32 len, void *buffer);
-static REGERR nr_WriteFile(FILEHANDLE fh, REGOFF offset, int32 len, void *buffer);
-static REGERR nr_LockRange(FILEHANDLE fh, REGOFF offset, int32 len);
-static REGERR nr_UnlockRange(FILEHANDLE fh, REGOFF offset, int32 len);
-static int32  nr_GetFileLength(FILEHANDLE fh);
-/* -------------------------------------------------------------------- */
-
-#ifdef STANDALONE_REGISTRY
-static REGERR nr_OpenFile(const char *path, FILEHANDLE *fh)
-{
-    XP_ASSERT( path != NULL );
-    XP_ASSERT( fh != NULL );
-
-    /* Open the file for exclusive random read/write */
-    (*fh) = vr_fileOpen(path, XP_FILE_UPDATE_BIN);
-    if ( !VALID_FILEHANDLE(*fh) )
-    {
-        switch (errno)
-        {
-        case ENOENT:    /* file not found */
-            return REGERR_NOFILE;
-
-        case EROFS:     /* read-only file system */
-        case EACCES:    /* file in use or read-only file*/
-            /* try read only */
-            (*fh) = vr_fileOpen(path, XP_FILE_READ_BIN);
-            if ( VALID_FILEHANDLE(*fh) )
-                return REGERR_READONLY;
-            else
-                return REGERR_FAIL;
-
-        default:
-            return REGERR_FAIL;
-        }
-    }
-
-    return REGERR_OK;
-
-}   /* OpenFile */
-#else
-static REGERR nr_OpenFile(const char *path, FILEHANDLE *fh)
-{
-    PR_ASSERT( path != NULL );
-    PR_ASSERT( fh != NULL );
-
-    /* Open the file for exclusive random read/write */
-    *fh = XP_FileOpen(path, XP_FILE_UPDATE_BIN);
-    if ( !VALID_FILEHANDLE(*fh) )
-    {
-        XP_StatStruct st;
-        if ( XP_Stat( path, &st ) != 0 )
-        {
-            /* file doesn't exist, so create */
-            *fh = XP_FileOpen(path, XP_FILE_TRUNCATE_BIN);
-        }
-    }
-
-    if ( !VALID_FILEHANDLE(*fh) )
-    {
-      /* For whatever reason we failed every attempt of getting */
-      /* a read/write registry. Let's try a read-only registry. */
-      (*fh) = XP_FileOpen(path, XP_FILE_READ_BIN);
-      if ( VALID_FILEHANDLE(*fh) )
-        return REGERR_READONLY;
-      else
-        /* we are in big trouble now */
-        return REGERR_FAIL;
-    }
-
-    /* succeded in getting a read/write registry */
-    return REGERR_OK;
-
-}   /* OpenFile */
-#endif
-
-
-static REGERR nr_CloseFile(FILEHANDLE *fh)
-{
-    /* NOTE: 'fh' is a pointer, unlike other Close functions
-     *       This is necessary so that nr_CloseFile can set it to NULL
-     */
-
-    XP_ASSERT( fh != NULL );
-    if ( VALID_FILEHANDLE(*fh) )
-        XP_FileClose(*fh);
-    (*fh) = NULL;
-    return REGERR_OK;
-