Bug 792050 - Allow to precompile startup cache without omnijar'ing first. r=khuey

This commit is contained in:
Mike Hommey 2012-10-02 14:17:40 +02:00
parent 8c8aaac6dc
commit 0dda19d6c3
2 changed files with 69 additions and 46 deletions

View File

@ -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 && \

View File

@ -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();
}