Merge inbound to mozilla-central. a=merge
authorOana Pop Rus <opoprus@mozilla.com>
Thu, 09 May 2019 06:34:15 +0300
changeset 535046 34a824c75b7b5618a06ba8987c418d6363da5038
parent 535042 59314da6bb6b37f3242e8a3b68dcb3849728818c (current diff)
parent 535045 465fa362c7020a91a653ba36f068487558114b89 (diff)
child 535049 9d0b46d9bb9ac851d04c0cce35e00d247ec77a6b
child 535110 3ce2113ec6925b3eb9f204f7175549f74cac6fc4
push id2082
push userffxbld-merge
push dateMon, 01 Jul 2019 08:34:18 +0000
treeherdermozilla-release@2fb19d0466d2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone68.0a1
first release with
nightly linux32
34a824c75b7b / 68.0a1 / 20190509033505 / files
nightly linux64
34a824c75b7b / 68.0a1 / 20190509033505 / files
nightly mac
34a824c75b7b / 68.0a1 / 20190509033505 / files
nightly win32
34a824c75b7b / 68.0a1 / 20190509033505 / files
nightly win64
34a824c75b7b / 68.0a1 / 20190509033505 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to mozilla-central. a=merge
dom/quota/test/unit/localStorageArchive2upgrade_profile.zip
dom/quota/test/unit/localStorageArchive3upgrade_profile.zip
dom/quota/test/unit/test_localStorageArchive2upgrade.js
dom/quota/test/unit/test_localStorageArchive3upgrade.js
modules/libpref/init/all.js
--- a/dom/localstorage/ActorsParent.cpp
+++ b/dom/localstorage/ActorsParent.cpp
@@ -33,16 +33,17 @@
 #include "mozilla/dom/quota/QuotaObject.h"
 #include "mozilla/dom/quota/UsageInfo.h"
 #include "mozilla/ipc/BackgroundChild.h"
 #include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/PBackgroundChild.h"
 #include "mozilla/ipc/PBackgroundParent.h"
 #include "mozilla/ipc/PBackgroundSharedTypes.h"
 #include "mozilla/Logging.h"
+#include "mozilla/storage/Variant.h"
 #include "nsClassHashtable.h"
 #include "nsDataHashtable.h"
 #include "nsExceptionHandler.h"
 #include "nsInterfaceHashtable.h"
 #include "nsIObjectInputStream.h"
 #include "nsIObjectOutputStream.h"
 #include "nsISimpleEnumerator.h"
 #include "nsNetUtil.h"
@@ -2339,16 +2340,19 @@ class LSRequestBase : public DatastoreOp
 };
 
 class PrepareDatastoreOp
     : public LSRequestBase,
       public OpenDirectoryListener,
       public SupportsCheckedUnsafePtr<CheckIf<DiagnosticAssertEnabled>> {
   class LoadDataOp;
 
+  class CompressFunction;
+  class CompressibleFunction;
+
   enum class NestedState {
     // The nesting has not yet taken place. Next step is
     // CheckExistingOperations.
     BeforeNesting,
 
     // Checking if a prepare datastore operation is already running for given
     // origin on the PBackground thread. Next step is CheckClosingDatastore.
     CheckExistingOperations,
@@ -2532,16 +2536,33 @@ class PrepareDatastoreOp::LoadDataOp fin
 
   void OnSuccess() override;
 
   void OnFailure(nsresult aResultCode) override;
 
   void Cleanup() override;
 };
 
+class PrepareDatastoreOp::CompressFunction final : public mozIStorageFunction {
+ private:
+  ~CompressFunction() = default;
+
+  NS_DECL_ISUPPORTS
+  NS_DECL_MOZISTORAGEFUNCTION
+};
+
+class PrepareDatastoreOp::CompressibleFunction final
+    : public mozIStorageFunction {
+ private:
+  ~CompressibleFunction() = default;
+
+  NS_DECL_ISUPPORTS
+  NS_DECL_MOZISTORAGEFUNCTION
+};
+
 class PrepareObserverOp : public LSRequestBase {
   const LSRequestPrepareObserverParams mParams;
   nsCString mOrigin;
 
  public:
   PrepareObserverOp(nsIEventTarget* aMainEventTarget,
                     const LSRequestParams& aParams);
 
@@ -7029,40 +7050,68 @@ nsresult PrepareDatastoreOp::DatabaseWor
 
     if (!quotaObject->MaybeUpdateSize(newUsage, /* aTruncate */ true)) {
       return NS_ERROR_FILE_NO_DEVICE_SPACE;
     }
 
     mozStorageTransaction transaction(
         connection, false, mozIStorageConnection::TRANSACTION_IMMEDIATE);
 
+    nsCOMPtr<mozIStorageFunction> function = new CompressFunction();
+
+    rv =
+        connection->CreateFunction(NS_LITERAL_CSTRING("compress"), 1, function);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+
+    function = new CompressibleFunction();
+
+    rv = connection->CreateFunction(NS_LITERAL_CSTRING("compressible"), 1,
+                                    function);
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+
     nsCOMPtr<mozIStorageStatement> stmt;
     rv = connection->CreateStatement(
-        NS_LITERAL_CSTRING("INSERT INTO data (key, value, utf16Length) "
-                           "SELECT key, value, utf16Length(value) "
-                           "FROM webappsstore2 "
-                           "WHERE originKey = :originKey "
-                           "AND originAttributes = :originAttributes;"
-
-                           ),
+        NS_LITERAL_CSTRING(
+            "INSERT INTO data (key, value, utf16Length, compressed) "
+            "SELECT key, compress(value), utf16Length(value), "
+            "compressible(value) "
+            "FROM webappsstore2 "
+            "WHERE originKey = :originKey "
+            "AND originAttributes = :originAttributes;"
+
+            ),
         getter_AddRefs(stmt));
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     rv = mArchivedOriginScope->BindToStatement(stmt);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     rv = stmt->Execute();
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
+    rv = connection->RemoveFunction(NS_LITERAL_CSTRING("compress"));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+
+    rv = connection->RemoveFunction(NS_LITERAL_CSTRING("compressible"));
+    if (NS_WARN_IF(NS_FAILED(rv))) {
+      return rv;
+    }
+
     rv = connection->CreateStatement(
         NS_LITERAL_CSTRING("UPDATE database SET usage = :usage;"),
         getter_AddRefs(stmt));
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     rv = stmt->BindInt64ByName(NS_LITERAL_CSTRING("usage"), newUsage);
@@ -7761,16 +7810,90 @@ void PrepareDatastoreOp::LoadDataOp::Cle
   MOZ_ASSERT(mPrepareDatastoreOp->mLoadDataOp == this);
 
   mPrepareDatastoreOp->mLoadDataOp = nullptr;
   mPrepareDatastoreOp = nullptr;
 
   ConnectionDatastoreOperationBase::Cleanup();
 }
 
+NS_IMPL_ISUPPORTS(PrepareDatastoreOp::CompressFunction, mozIStorageFunction)
+
+NS_IMETHODIMP
+PrepareDatastoreOp::CompressFunction::OnFunctionCall(
+    mozIStorageValueArray* aFunctionArguments, nsIVariant** aResult) {
+  AssertIsOnIOThread();
+  MOZ_ASSERT(aFunctionArguments);
+  MOZ_ASSERT(aResult);
+
+#ifdef DEBUG
+  {
+    uint32_t argCount;
+    MOZ_ALWAYS_SUCCEEDS(aFunctionArguments->GetNumEntries(&argCount));
+    MOZ_ASSERT(argCount == 1);
+
+    int32_t type;
+    MOZ_ALWAYS_SUCCEEDS(aFunctionArguments->GetTypeOfIndex(0, &type));
+    MOZ_ASSERT(type == mozIStorageValueArray::VALUE_TYPE_TEXT);
+  }
+#endif
+
+  nsCString value;
+  nsresult rv = aFunctionArguments->GetUTF8String(0, value);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  nsCString compressed;
+  if (!SnappyCompress(value, compressed)) {
+    compressed = value;
+  }
+
+  nsCOMPtr<nsIVariant> result = new storage::UTF8TextVariant(compressed);
+
+  result.forget(aResult);
+  return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(PrepareDatastoreOp::CompressibleFunction, mozIStorageFunction)
+
+NS_IMETHODIMP
+PrepareDatastoreOp::CompressibleFunction::OnFunctionCall(
+    mozIStorageValueArray* aFunctionArguments, nsIVariant** aResult) {
+  AssertIsOnIOThread();
+  MOZ_ASSERT(aFunctionArguments);
+  MOZ_ASSERT(aResult);
+
+#ifdef DEBUG
+  {
+    uint32_t argCount;
+    MOZ_ALWAYS_SUCCEEDS(aFunctionArguments->GetNumEntries(&argCount));
+    MOZ_ASSERT(argCount == 1);
+
+    int32_t type;
+    MOZ_ALWAYS_SUCCEEDS(aFunctionArguments->GetTypeOfIndex(0, &type));
+    MOZ_ASSERT(type == mozIStorageValueArray::VALUE_TYPE_TEXT);
+  }
+#endif
+
+  nsCString value;
+  nsresult rv = aFunctionArguments->GetUTF8String(0, value);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  nsCString compressed;
+  bool compressible = SnappyCompress(value, compressed);
+
+  nsCOMPtr<nsIVariant> result = new storage::IntegerVariant(compressible);
+
+  result.forget(aResult);
+  return NS_OK;
+}
+
 /*******************************************************************************
  * PrepareObserverOp
  ******************************************************************************/
 
 PrepareObserverOp::PrepareObserverOp(nsIEventTarget* aMainEventTarget,
                                      const LSRequestParams& aParams)
     : LSRequestBase(aMainEventTarget),
       mParams(aParams.get_LSRequestPrepareObserverParams()) {
index 6ee654e4223e64a0443995bed683e4f044e83efc..2f60db2a456b9b918418888847d82c95dbaf2064
GIT binary patch
literal 4096
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
--- a/dom/quota/ActorsParent.cpp
+++ b/dom/quota/ActorsParent.cpp
@@ -213,17 +213,17 @@ const char kResourceOriginPrefix[] = "re
 #define METADATA_TMP_FILE_NAME ".metadata-tmp"
 #define METADATA_V2_FILE_NAME ".metadata-v2"
 #define METADATA_V2_TMP_FILE_NAME ".metadata-v2-tmp"
 
 #define WEB_APPS_STORE_FILE_NAME "webappsstore.sqlite"
 #define LS_ARCHIVE_FILE_NAME "ls-archive.sqlite"
 #define LS_ARCHIVE_TMP_FILE_NAME "ls-archive-tmp.sqlite"
 
-const uint32_t kLocalStorageArchiveVersion = 3;
+const uint32_t kLocalStorageArchiveVersion = 4;
 
 const char kProfileDoChangeTopic[] = "profile-do-change";
 
 /******************************************************************************
  * SQLite functions
  ******************************************************************************/
 
 int32_t MakeStorageVersion(uint32_t aMajorStorageVersion,
@@ -441,16 +441,17 @@ nsresult LoadLocalStorageArchiveVersion(
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   aVersion = version;
   return NS_OK;
 }
 
+/*
 nsresult SaveLocalStorageArchiveVersion(mozIStorageConnection* aConnection,
                                         uint32_t aVersion) {
   AssertIsOnIOThread();
   MOZ_ASSERT(aConnection);
 
   nsCOMPtr<mozIStorageStatement> stmt;
   nsresult rv = aConnection->CreateStatement(
       NS_LITERAL_CSTRING("UPDATE database SET version = :version;"),
@@ -466,16 +467,17 @@ nsresult SaveLocalStorageArchiveVersion(
 
   rv = stmt->Execute();
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   return NS_OK;
 }
+*/
 
 /******************************************************************************
  * Quota manager class declarations
  ******************************************************************************/
 
 }  // namespace
 
 class DirectoryLockImpl final : public DirectoryLock {
@@ -5326,53 +5328,48 @@ nsresult QuotaManager::DowngradeLocalSto
   rv = InitializeLocalStorageArchive(aConnection, kLocalStorageArchiveVersion);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
   return NS_OK;
 }
 
-nsresult QuotaManager::UpgradeLocalStorageArchiveFrom0To1(
+nsresult QuotaManager::UpgradeLocalStorageArchiveFromLessThan4To4(
     nsCOMPtr<mozIStorageConnection>& aConnection) {
   AssertIsOnIOThread();
   MOZ_ASSERT(CachedNextGenLocalStorageEnabled());
 
   nsresult rv = RecreateLocalStorageArchive(aConnection);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
 
-  rv = InitializeLocalStorageArchive(aConnection, 1);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  return NS_OK;
-}
-
-nsresult QuotaManager::UpgradeLocalStorageArchiveFrom1To2(
+  rv = InitializeLocalStorageArchive(aConnection, 4);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  return NS_OK;
+}
+
+/*
+nsresult QuotaManager::UpgradeLocalStorageArchiveFrom4To5(
     nsCOMPtr<mozIStorageConnection>& aConnection) {
-  nsresult rv = SaveLocalStorageArchiveVersion(aConnection, 2);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  return NS_OK;
-}
-
-nsresult QuotaManager::UpgradeLocalStorageArchiveFrom2To3(
-    nsCOMPtr<mozIStorageConnection>& aConnection) {
-  nsresult rv = SaveLocalStorageArchiveVersion(aConnection, 3);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  return NS_OK;
-}
+  AssertIsOnIOThread();
+  MOZ_ASSERT(CachedNextGenLocalStorageEnabled());
+
+  nsresult rv = SaveLocalStorageArchiveVersion(aConnection, 5);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return rv;
+  }
+
+  return NS_OK;
+}
+*/
 
 #ifdef DEBUG
 
 void QuotaManager::AssertStorageIsInitialized() const {
   AssertIsOnIOThread();
   MOZ_ASSERT(mStorageInitialized);
 }
 
@@ -5586,28 +5583,27 @@ nsresult QuotaManager::EnsureStorageIsIn
         MOZ_ASSERT(version == 0);
 
         rv = InitializeLocalStorageArchive(connection,
                                            kLocalStorageArchiveVersion);
         if (NS_WARN_IF(NS_FAILED(rv))) {
           return rv;
         }
       } else {
-        static_assert(kLocalStorageArchiveVersion == 3,
+        static_assert(kLocalStorageArchiveVersion == 4,
                       "Upgrade function needed due to LocalStorage archive "
                       "version increase.");
 
         while (version != kLocalStorageArchiveVersion) {
-          if (version == 0) {
-            rv = UpgradeLocalStorageArchiveFrom0To1(connection);
-          } else if (version == 1) {
-            rv = UpgradeLocalStorageArchiveFrom1To2(connection);
-          } else if (version == 2) {
-            rv = UpgradeLocalStorageArchiveFrom2To3(connection);
-          } else {
+          if (version < 4) {
+            rv = UpgradeLocalStorageArchiveFromLessThan4To4(connection);
+          } /* else if (version == 4) {
+            rv = UpgradeLocalStorageArchiveFrom4To5(connection);
+          } */
+          else {
             QM_WARNING(
                 "Unable to initialize LocalStorage archive, no upgrade path is "
                 "available!");
             return NS_ERROR_FAILURE;
           }
 
           if (NS_WARN_IF(NS_FAILED(rv))) {
             return rv;
--- a/dom/quota/QuotaManager.h
+++ b/dom/quota/QuotaManager.h
@@ -478,24 +478,22 @@ class QuotaManager final : public Backgr
       mozIStorageConnection** aConnection, bool& aNewlyCreated);
 
   nsresult RecreateLocalStorageArchive(
       nsCOMPtr<mozIStorageConnection>& aConnection);
 
   nsresult DowngradeLocalStorageArchive(
       nsCOMPtr<mozIStorageConnection>& aConnection);
 
-  nsresult UpgradeLocalStorageArchiveFrom0To1(
+  nsresult UpgradeLocalStorageArchiveFromLessThan4To4(
       nsCOMPtr<mozIStorageConnection>& aConnection);
 
-  nsresult UpgradeLocalStorageArchiveFrom1To2(
-      nsCOMPtr<mozIStorageConnection>& aConnection);
-
-  nsresult UpgradeLocalStorageArchiveFrom2To3(
-      nsCOMPtr<mozIStorageConnection>& aConnection);
+  /*
+  nsresult UpgradeLocalStorageArchiveFrom4To5();
+  */
 
   nsresult InitializeRepository(PersistenceType aPersistenceType);
 
   nsresult InitializeOrigin(PersistenceType aPersistenceType,
                             const nsACString& aGroup, const nsACString& aOrigin,
                             int64_t aAccessTime, bool aPersisted,
                             nsIFile* aDirectory);
 
deleted file mode 100644
index 8883ea4630468f1c63076254109d53429752b8ca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index e475d3d17540b10922e395f28afeb97a56e07bff..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cf5b29adae091387926af9a1c9c8b54cf10cc606
GIT binary patch
literal 7853
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
deleted file mode 100644
--- a/dom/quota/test/unit/test_localStorageArchive2upgrade.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-/**
- * This test is mainly to verify that local storage directories are not removed
- * during local storage archive upgrade from version 1 to version 2.
- * See bug 1546310.
- */
-
-async function testSteps() {
-  const lsDirs = [
-    "storage/default/http+++example.com/ls",
-    "storage/default/http+++localhost/ls",
-    "storage/default/http+++www.mozilla.org/ls",
-  ];
-
-  info("Clearing");
-
-  let request = clear();
-  await requestFinished(request);
-
-  info("Installing package");
-
-  // The profile contains three initialized origin directories with local
-  // storage data, local storage archive, a script for origin initialization,
-  // the storage database and the web apps store database:
-  // - storage/default/https+++example.com
-  // - storage/default/https+++localhost
-  // - storage/default/https+++www.mozilla.org
-  // - storage/ls-archive.sqlite
-  // - create_db.js
-  // - storage.sqlite
-  // - webappsstore.sqlite
-  // The file create_db.js in the package was run locally (with a build with
-  // local storage archive version 1), specifically it was temporarily added to
-  // xpcshell.ini and then executed:
-  //   mach xpcshell-test --interactive dom/localstorage/test/unit/create_db.js
-  // Note: to make it become the profile in the test, additional manual steps
-  // are needed.
-  // 1. Remove the folder "storage/temporary".
-  installPackage("localStorageArchive2upgrade_profile");
-
-  info("Checking ls dirs");
-
-  for (let lsDir of lsDirs) {
-    let dir = getRelativeFile(lsDir);
-
-    exists = dir.exists();
-    ok(exists, "ls directory does exist");
-  }
-
-  request = init();
-  request = await requestFinished(request);
-
-  info("Checking ls dirs");
-
-  for (let lsDir of lsDirs) {
-    let dir = getRelativeFile(lsDir);
-
-    exists = dir.exists();
-    ok(exists, "ls directory does exist");
-  }
-}
deleted file mode 100644
--- a/dom/quota/test/unit/test_localStorageArchive3upgrade.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-/**
- * This test is mainly to verify that local storage directories are not removed
- * during local storage archive upgrade from version 2 to version 3.
- * See bug 1513937.
- */
-
-async function testSteps() {
-  const lsDirs = [
-    "storage/default/http+++example.com/ls",
-    "storage/default/http+++localhost/ls",
-    "storage/default/http+++www.mozilla.org/ls",
-  ];
-
-  info("Clearing");
-
-  let request = clear();
-  await requestFinished(request);
-
-  info("Installing package");
-
-  // The profile contains three initialized origin directories with local
-  // storage data, local storage archive, a script for origin initialization,
-  // the storage database and the web apps store database:
-  // - storage/default/https+++example.com
-  // - storage/default/https+++localhost
-  // - storage/default/https+++www.mozilla.org
-  // - storage/ls-archive.sqlite
-  // - create_db.js
-  // - storage.sqlite
-  // - webappsstore.sqlite
-  // The file create_db.js in the package was run locally (with a build with
-  // local storage archive version 2), specifically it was temporarily added to
-  // xpcshell.ini and then executed:
-  //   mach xpcshell-test --interactive dom/localstorage/test/unit/create_db.js
-  // Note: to make it become the profile in the test, additional manual steps
-  // are needed.
-  // 1. Remove the folder "storage/temporary".
-  installPackage("localStorageArchive3upgrade_profile");
-
-  info("Checking ls dirs");
-
-  for (let lsDir of lsDirs) {
-    let dir = getRelativeFile(lsDir);
-
-    exists = dir.exists();
-    ok(exists, "ls directory does exist");
-  }
-
-  request = init();
-  request = await requestFinished(request);
-
-  info("Checking ls dirs");
-
-  for (let lsDir of lsDirs) {
-    let dir = getRelativeFile(lsDir);
-
-    exists = dir.exists();
-    ok(exists, "ls directory does exist");
-  }
-}
new file mode 100644
--- /dev/null
+++ b/dom/quota/test/unit/test_localStorageArchive4upgrade.js
@@ -0,0 +1,95 @@
+/**
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * This test is mainly to verify that local storage directories are removed
+ * during local storage archive upgrade from version 3 to version 4.
+ * See bug 1549654.
+ */
+
+async function testSteps() {
+  const lsDirs = [
+    "storage/default/http+++localhost/ls",
+    "storage/default/http+++www.mozilla.org/ls",
+    "storage/default/http+++example.com/ls",
+  ];
+
+  const principalInfos = [
+    "http://localhost",
+    "http://www.mozilla.org",
+    "http://example.com",
+  ];
+
+  const data = [
+    { key: "foo0", value: "bar" },
+    { key: "foo1", value: "A" },
+    { key: "foo2", value: "A".repeat(100) },
+  ];
+
+  function getLocalStorage(principal) {
+    return Services.domStorageManager.createStorage(null, principal, "");
+  }
+
+  info("Clearing");
+
+  let request = clear();
+  await requestFinished(request);
+
+  info("Installing package");
+
+  // The profile contains three initialized origin directories with local
+  // storage data, local storage archive, a script for origin initialization,
+  // the storage database and the web apps store database:
+  // - storage/default/https+++example.com
+  // - storage/default/https+++localhost
+  // - storage/default/https+++www.mozilla.org
+  // - storage/ls-archive.sqlite
+  // - create_db.js
+  // - storage.sqlite
+  // - webappsstore.sqlite
+  // The file create_db.js in the package was run locally (with a build with
+  // local storage archive version 3), specifically it was temporarily added to
+  // xpcshell.ini and then executed:
+  //   mach xpcshell-test --interactive dom/localstorage/test/unit/create_db.js
+  // Note: to make it become the profile in the test, additional manual steps
+  // are needed.
+  // 1. Remove the folder "storage/temporary".
+  installPackage("localStorageArchive4upgrade_profile");
+
+  info("Checking ls dirs");
+
+  for (let lsDir of lsDirs) {
+    let dir = getRelativeFile(lsDir);
+
+    exists = dir.exists();
+    ok(exists, "ls directory does exist");
+  }
+
+  request = init();
+  request = await requestFinished(request);
+
+  info("Checking ls dirs");
+
+  for (let lsDir of lsDirs) {
+    let dir = getRelativeFile(lsDir);
+
+    exists = dir.exists();
+    ok(!exists, "ls directory doesn't exist");
+  }
+
+  info("Getting storages");
+
+  let storages = [];
+  for (let i = 0; i < principalInfos.length; i++) {
+    let storage = getLocalStorage(getPrincipal(principalInfos[i]));
+    storages.push(storage);
+  }
+
+  info("Verifying data");
+
+  for (let i = 0; i < storages.length; i++) {
+    is(storages[i].getItem(data[i].key), data[i].value, "Correct value");
+  }
+}
--- a/dom/quota/test/unit/xpcshell.ini
+++ b/dom/quota/test/unit/xpcshell.ini
@@ -9,18 +9,17 @@ support-files =
   clearStorageForPrincipal_profile.zip
   createLocalStorage_profile.zip
   defaultStorageUpgrade_profile.zip
   getUsage_profile.zip
   groupMismatch_profile.zip
   idbSubdirUpgrade1_profile.zip
   idbSubdirUpgrade2_profile.zip
   localStorageArchive1upgrade_profile.zip
-  localStorageArchive2upgrade_profile.zip
-  localStorageArchive3upgrade_profile.zip
+  localStorageArchive4upgrade_profile.zip
   localStorageArchiveDowngrade_profile.zip
   morgueCleanup_profile.zip
   obsoleteOriginAttributes_profile.zip
   originAttributesUpgrade_profile.zip
   removeLocalStorage1_profile.zip
   removeLocalStorage2_profile.zip
   storagePersistentUpgrade_profile.zip
   tempMetadataCleanup_profile.zip
@@ -33,18 +32,17 @@ support-files =
 [test_clearStorageForPrincipal.js]
 [test_defaultStorageUpgrade.js]
 [test_getUsage.js]
 [test_groupMismatch.js]
 [test_idbSubdirUpgrade.js]
 [test_initTemporaryStorage.js]
 [test_listInitializedOrigins.js]
 [test_localStorageArchive1upgrade.js]
-[test_localStorageArchive2upgrade.js]
-[test_localStorageArchive3upgrade.js]
+[test_localStorageArchive4upgrade.js]
 [test_localStorageArchiveDowngrade.js]
 [test_morgueCleanup.js]
 [test_obsoleteOriginAttributesUpgrade.js]
 [test_obsoleteOrigins.js]
 [test_originAttributesUpgrade.js]
 [test_persist.js]
 [test_persist_eviction.js]
 [test_persist_globalLimit.js]
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -1619,16 +1619,17 @@ pref("network.protocol-handler.external-
 pref("network.protocol-handler.warn-external-default", true); // warn before load
 
 // Prevent using external protocol handlers for these schemes
 pref("network.protocol-handler.external.hcp", false);
 pref("network.protocol-handler.external.vbscript", false);
 pref("network.protocol-handler.external.javascript", false);
 pref("network.protocol-handler.external.data", false);
 pref("network.protocol-handler.external.ms-help", false);
+pref("network.protocol-handler.external.res", false);
 pref("network.protocol-handler.external.shell", false);
 pref("network.protocol-handler.external.vnd.ms.radio", false);
 #ifdef XP_MACOSX
 pref("network.protocol-handler.external.help", false);
 #endif
 pref("network.protocol-handler.external.disk", false);
 pref("network.protocol-handler.external.disks", false);
 pref("network.protocol-handler.external.afp", false);