Bug 792050 - Allow to precompile startup cache without omnijar'ing first. r=khuey
authorMike Hommey <mh+mozilla@glandium.org>
Tue, 02 Oct 2012 14:17:40 +0200
changeset 109320 305cace7ba512269a3abc45978ab8229836962fb
parent 109319 ccdf4f53d3cb9112e5da6b6b65b51d251d9a1834
child 109321 0575f1f6062ec513cb1a89f322b4914414771476
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');" && \
+  $(_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('startupCache.zip');" && \
   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,92 @@
  * 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 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 openJar(file) {
-  var zipreader = Cc["@mozilla.org/libjar/zip-reader;1"].
-    createInstance(Ci.nsIZipReader);
-  zipreader.open(file);
-  return zipreader;
+function resolveResource(spec) {
+  var uri = Services.io.newURI(spec, null, null);
+  return Services.io.newURI(rph.resolveURI(uri), null, null);
 }
 
-function populate_startupcache(prop, omnijarName, startupcacheName) {
-  var file = getDir(prop);
-  file.append(omnijarName);
-  zipreader = openJar(file);
-
-  var scFile = getDir(prop);
+function populate_startupcache(startupcacheName) {
+  var scFile = Services.dirsvc.get("CurWorkD", Ci.nsIFile);
   scFile.append(startupcacheName);
-  setenv("MOZ_STARTUP_CACHE", scFile.path);
+  let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
+  env.set('MOZ_STARTUP_CACHE', scFile.path);
 
-  let prefix = "resource:///";
+  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);
 }
+
+