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 115509 305cace7ba512269a3abc45978ab8229836962fb
parent 115508 ccdf4f53d3cb9112e5da6b6b65b51d251d9a1834
child 115510 0575f1f6062ec513cb1a89f322b4914414771476
push id1708
push userakeybl@mozilla.com
push dateMon, 19 Nov 2012 21:10:21 +0000
treeherdermozilla-beta@27b14fe50103 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskhuey
bugs792050
milestone18.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
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);
 }
+
+