Bug 792050 - Allow to precompile startup cache without omnijar'ing first. r=khuey
☠☠ backed out by bf9c0d80b36e ☠ ☠
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 02 Oct 2012 14:17:40 +0200
changeset 109006 572b3980300cf81df71f5ae27a9aa281f4586d40
parent 108999 ea93afa3c7b7832ab5820d012c1f1035784cb3f2
child 109007 dc70ce87180c1c8e2c68ece7c5927205eb6ff7e9
push id82
push usershu@rfrn.org
push dateFri, 05 Oct 2012 13:20:22 +0000
reviewerskhuey
bugs792050
milestone18.0a1
Bug 792050 - Allow to precompile startup cache without omnijar'ing first. r=khuey
toolkit/mozapps/installer/packager.mk
toolkit/mozapps/installer/precompile_cache.js
--- a/toolkit/mozapps/installer/packager.mk
+++ b/toolkit/mozapps/installer/packager.mk
@@ -450,28 +450,26 @@ endif # MOZ_CAN_RUN_PROGRAMS
 
 ifdef GENERATE_CACHE
 ifdef MOZ_CAN_RUN_PROGRAMS
 ifdef RUN_TEST_PROGRAM
 _ABS_RUN_TEST_PROGRAM = $(call core_abspath,$(RUN_TEST_PROGRAM))
 endif
 
 ifdef LIBXUL_SDK
-PRECOMPILE_DIR=XCurProcD
 PRECOMPILE_RESOURCE=app
 PRECOMPILE_GRE=$(LIBXUL_DIST)/bin
 else
-PRECOMPILE_DIR=GreD
 PRECOMPILE_RESOURCE=gre
 PRECOMPILE_GRE=$$PWD
 endif
 
 # Silence the unzip step so we don't print any binary data from the comment field.
 GENERATE_CACHE = \
-  $(_ABS_RUN_TEST_PROGRAM) $(LIBXUL_DIST)/bin/xpcshell$(BIN_SUFFIX) -g "$(PRECOMPILE_GRE)" -a "$$PWD" -f $(call core_abspath,$(MOZILLA_DIR)/toolkit/mozapps/installer/precompile_cache.js) -e "populate_startupcache('$(PRECOMPILE_DIR)', '$(OMNIJAR_NAME)', 'startupCache.zip');" && \
+  MOZ_STARTUP_CACHE=$$PWD/startupCache.zip $(_ABS_RUN_TEST_PROGRAM) $(LIBXUL_DIST)/bin/xpcshell$(BIN_SUFFIX) -g "$(PRECOMPILE_GRE)" -a "$$PWD" -f $(call core_abspath,$(MOZILLA_DIR)/toolkit/mozapps/installer/precompile_cache.js) -e "populate_startupcache();" && \
   rm -rf jsloader jssubloader && \
   $(UNZIP) -q startupCache.zip && \
   rm startupCache.zip && \
   $(ZIP) -r9m $(OMNIJAR_NAME) jsloader/resource/$(PRECOMPILE_RESOURCE) jssubloader/*/resource/$(PRECOMPILE_RESOURCE) && \
   rm -rf jsloader jssubloader
 else
 GENERATE_CACHE = true
 endif
--- a/toolkit/mozapps/installer/precompile_cache.js
+++ b/toolkit/mozapps/installer/precompile_cache.js
@@ -5,62 +5,87 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // see http://mxr.mozilla.org/mozilla-central/source/services/sync/Weave.js#76
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
-function setenv(name, val) {
-  try {
-    var environment = Components.classes["@mozilla.org/process/environment;1"].
-      getService(Components.interfaces.nsIEnvironment);
-    environment.set(name, val);
-  } catch(e) {
-    displayError("setenv", e);
+Cu.import("resource://gre/modules/Services.jsm");
+
+const rph = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
+
+function endsWith(str, end) {
+  return str.slice(-end.length) == end;
+}
+
+function jar_entries(jarReader, pattern) {
+  var entries = [];
+  var enumerator = jarReader.findEntries(pattern);
+  while (enumerator.hasMore()) {
+    entries.push(enumerator.getNext());
   }
+  return entries;
 }
 
-function load(url) {
-  print(url);
-  try {
-    Cu.import(url, null);
-  } catch(e) {
-    dump("Failed to import " + url + ":" + e + "\n");
+function dir_entries(baseDir, subpath, ext) {
+  var dir = baseDir.clone();
+  dir.append(subpath);
+  var enumerator = dir.directoryEntries;
+  var entries = [];
+  while (enumerator.hasMoreElements()) {
+    var file = enumerator.getNext().QueryInterface(Ci.nsIFile);
+    if (file.isDirectory()) {
+      entries = entries.concat(dir_entries(dir, file.leafName, ext).map(function(p) subpath + "/" + p));
+    } else if (endsWith(file.leafName, ext)) {
+      entries.push(subpath + "/" + file.leafName);
+    }
   }
+  return entries;
 }
 
-function load_entries(entries, prefix) {
-  while (entries.hasMore()) {
-    var c = entries.getNext();
-    load(prefix + c);
+function get_modules_under(uri) {
+  if (uri instanceof Ci.nsIJARURI) {
+    var jar = uri.QueryInterface(Ci.nsIJARURI);
+    var jarReader = Cc["@mozilla.org/libjar/zip-reader;1"].createInstance(Ci.nsIZipReader);
+    var file = jar.JARFile.QueryInterface(Ci.nsIFileURL);
+    jarReader.open(file.file);
+    var entries = jar_entries(jarReader, "components/*.js")
+                  .concat(jar_entries(jarReader, "modules/*.js"))
+                  .concat(jar_entries(jarReader, "modules/*.jsm"));
+    jarReader.close();
+    return entries;
+  } else if (uri instanceof Ci.nsIFileURL){
+    var file = uri.QueryInterface(Ci.nsIFileURL);
+    return dir_entries(file.file, "components", ".js")
+           .concat(dir_entries(file.file, "modules", ".js"))
+           .concat(dir_entries(file.file, "modules", ".jsm"));
+  } else {
+    throw "Expected a nsIJARURI or nsIFileURL";
   }
 }
 
-function getDir(prop) {
-  return Cc["@mozilla.org/file/directory_service;1"].
-    getService(Ci.nsIProperties).get(prop, Ci.nsIFile);
-}
-
-function openJar(file) {
-  var zipreader = Cc["@mozilla.org/libjar/zip-reader;1"].
-    createInstance(Ci.nsIZipReader);
-  zipreader.open(file);
-  return zipreader;
+function load_modules_under(spec, uri) {
+  var entries = get_modules_under(uri);
+  for each (let entry in entries) {
+    try {
+      dump(spec + entry + "\n");
+      Cu.import(spec + entry, null);
+    } catch(e) {}
+  }
 }
 
-function populate_startupcache(prop, omnijarName, startupcacheName) {
-  var file = getDir(prop);
-  file.append(omnijarName);
-  zipreader = openJar(file);
+function resolveResource(spec) {
+  var uri = Services.io.newURI(spec, null, null);
+  return Services.io.newURI(rph.resolveURI(uri), null, null);
+}
 
-  var scFile = getDir(prop);
-  scFile.append(startupcacheName);
-  setenv("MOZ_STARTUP_CACHE", scFile.path);
-
-  let prefix = "resource:///";
+function populate_startupcache() {
+  var greURI = resolveResource("resource://gre/");
+  var appURI = resolveResource("resource://app/");
 
-  load_entries(zipreader.findEntries("components/*js"), prefix);
-  load_entries(zipreader.findEntries("modules/*js"), prefix);
-  load_entries(zipreader.findEntries("modules/*jsm"), prefix);
-  zipreader.close();
+  load_modules_under("resource://gre/", greURI);
+  if (!appURI.equals(greURI))
+    load_modules_under("resource://app/", appURI);
 }
+
+