Bug 1363482: Part 5 - Preload component manifests off-thread during startup. r?erahm draft
authorKris Maglione <maglione.k@gmail.com>
Fri, 12 May 2017 17:55:47 -0700
changeset 656259 2fa91779568e68d11c9d1b89850ad0466b05d302
parent 656258 c6e5e1f24ee3be5569092b8cb107ef83744d12fe
child 656260 ac90f1f0fb0f2988dfee4fcd4e635582b398f120
push id77137
push usermaglione.k@gmail.com
push dateWed, 30 Aug 2017 23:02:44 +0000
reviewerserahm
bugs1363482
milestone57.0a1
Bug 1363482: Part 5 - Preload component manifests off-thread during startup. r?erahm MozReview-Commit-ID: 2BTkf2C5tMI
xpcom/components/nsComponentManager.cpp
--- a/xpcom/components/nsComponentManager.cpp
+++ b/xpcom/components/nsComponentManager.cpp
@@ -44,16 +44,17 @@
 
 #include "mozilla/GenericFactory.h"
 #include "nsSupportsPrimitives.h"
 #include "nsArray.h"
 #include "nsIMutableArray.h"
 #include "nsArrayEnumerator.h"
 #include "nsStringEnumerator.h"
 #include "mozilla/FileUtils.h"
+#include "mozilla/URLPreloader.h"
 #include "mozilla/UniquePtr.h"
 #include "nsDataHashtable.h"
 
 #include <new>     // for placement new
 
 #include "mozilla/Omnijar.h"
 
 #include "mozilla/Logging.h"
@@ -533,30 +534,22 @@ CutExtension(nsCString& aPath)
 
 static void
 DoRegisterManifest(NSLocationType aType,
                    FileLocation& aFile,
                    bool aChromeOnly,
                    bool aXPTOnly)
 {
   MOZ_ASSERT(!aXPTOnly || !nsComponentManagerImpl::gComponentManager);
-  uint32_t len;
-  FileLocation::Data data;
-  UniquePtr<char[]> buf;
-  nsresult rv = aFile.GetData(data);
-  if (NS_SUCCEEDED(rv)) {
-    rv = data.GetSize(&len);
-  }
-  if (NS_SUCCEEDED(rv)) {
-    buf = MakeUnique<char[]>(len + 1);
-    rv = data.Copy(buf.get(), len);
-  }
-  if (NS_SUCCEEDED(rv)) {
-    buf[len] = '\0';
-    ParseManifest(aType, aFile, buf.get(), aChromeOnly, aXPTOnly);
+
+  auto result = URLPreloader::Read(aFile);
+  if (result.isOk()) {
+    nsCString buf(result.unwrap());
+
+    ParseManifest(aType, aFile, buf.BeginWriting(), aChromeOnly, aXPTOnly);
   } else if (NS_BOOTSTRAPPED_LOCATION != aType) {
     nsCString uri;
     aFile.GetURIString(uri);
     LogMessage("Could not read chrome manifest '%s'.", uri.get());
   }
 }
 
 void