From 0dda19d6c3eabed8f8741d509e9e2f16c09a3053 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Tue, 2 Oct 2012 14:17:40 +0200 Subject: [PATCH] Bug 792050 - Allow to precompile startup cache without omnijar'ing first. r=khuey --- toolkit/mozapps/installer/packager.mk | 4 +- toolkit/mozapps/installer/precompile_cache.js | 111 +++++++++++------- 2 files changed, 69 insertions(+), 46 deletions(-) diff --git a/toolkit/mozapps/installer/packager.mk b/toolkit/mozapps/installer/packager.mk index 4bdade1de42..fc363b599cc 100644 --- a/toolkit/mozapps/installer/packager.mk +++ b/toolkit/mozapps/installer/packager.mk @@ -455,18 +455,16 @@ _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 && \ diff --git a/toolkit/mozapps/installer/precompile_cache.js b/toolkit/mozapps/installer/precompile_cache.js index 75d726491b0..64c99beaf44 100644 --- a/toolkit/mozapps/installer/precompile_cache.js +++ b/toolkit/mozapps/installer/precompile_cache.js @@ -10,57 +10,82 @@ 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 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 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 load(url) { - print(url); - try { - Cu.import(url, null); - } catch(e) { - dump("Failed to import " + url + ":" + e + "\n"); +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 load_entries(entries, prefix) { - while (entries.hasMore()) { - var c = entries.getNext(); - load(prefix + c); - } +function resolveResource(spec) { + var uri = Services.io.newURI(spec, null, null); + return Services.io.newURI(rph.resolveURI(uri), null, null); } -function getDir(prop) { - return Cc["@mozilla.org/file/directory_service;1"]. - getService(Ci.nsIProperties).get(prop, Ci.nsIFile); +function populate_startupcache() { + var greURI = resolveResource("resource://gre/"); + var appURI = resolveResource("resource://app/"); + + load_modules_under("resource://gre/", greURI); + if (!appURI.equals(greURI)) + load_modules_under("resource://app/", appURI); } -function openJar(file) { - var zipreader = Cc["@mozilla.org/libjar/zip-reader;1"]. - createInstance(Ci.nsIZipReader); - zipreader.open(file); - return zipreader; -} -function populate_startupcache(prop, omnijarName, startupcacheName) { - var file = getDir(prop); - file.append(omnijarName); - zipreader = openJar(file); - - var scFile = getDir(prop); - scFile.append(startupcacheName); - setenv("MOZ_STARTUP_CACHE", scFile.path); - - let prefix = "resource:///"; - - load_entries(zipreader.findEntries("components/*js"), prefix); - load_entries(zipreader.findEntries("modules/*js"), prefix); - load_entries(zipreader.findEntries("modules/*jsm"), prefix); - zipreader.close(); -}