gecko/toolkit/mozapps/installer/precompile_cache.js

95 lines
3.3 KiB
JavaScript
Raw Normal View History

/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
2012-05-21 04:12:37 -07:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* 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;
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_modules_under(spec, uri) {
var entries = get_modules_under(uri).sort();
Bug 889911 - Switch xpcshell to SystemErrorReporter with a little bit of special magic. r=mrbkap XPCShell currently overrides all the JSContexts whose creation it observes with its own custom error reporter. This reporter does all sorts of funny things which we try to clean up for the most part. But there are a few very intricate considerations at play. First, the old xpcshell error reporter does some mumbo jumbo with the XPCCallContext stack to try to guess whether some other code might catch the exception. This is total garbage on a number of fronts, particularly because the XPCCallContext stack has no concept of saved frame chains, nested event loops, sandbox boundaries, origin boundaries, or any of the myriad of complicating factors that determine whether or not an exception will propagate. So we get rid of it. But this causes some crazy debugger tests to fail, because they rely on an exception from uriloader/exthandler/nsHandlerService.js getting squelched, and can't handle anybody reporting errors to the console service at the particular moment of contortionism when the exception is raised. So we need to introduce an explicit mechanism to disable the error reporter here to keep things running. Second, we have to be very careful about tracking the return status of the xpcshell binary. The old code would simply flag an error code if the error handler was invoked, and we can mostly continue to do that. But there are some complications. See the comments. Finally, we don't anything analogous in XPCShellEnvironment, because I have patches in bug 889714 to remove its state-dependence on the error reporter. I'll switch it to SystemErrorReporter in that bug.
2013-07-16 20:38:44 -07:00
// The precompilation of JS here sometimes reports errors, which we don't
// really care about. But if the errors are ever reported to xpcshell's
// error reporter, it will cause it to return an error code, which will break
// automation. Currently they won't be, because the component loader spins up
// its JSContext before xpcshell has time to set its context callback (which
// overrides the error reporter on all newly-created JSContexts). But as we
// move towards a singled-cxed browser, we'll run into this. So let's be
// forward-thinking and deal with it now.
ignoreReportedErrors(true);
for each (let entry in entries) {
try {
dump(spec + entry + "\n");
Cu.import(spec + entry, null);
} catch(e) {}
}
Bug 889911 - Switch xpcshell to SystemErrorReporter with a little bit of special magic. r=mrbkap XPCShell currently overrides all the JSContexts whose creation it observes with its own custom error reporter. This reporter does all sorts of funny things which we try to clean up for the most part. But there are a few very intricate considerations at play. First, the old xpcshell error reporter does some mumbo jumbo with the XPCCallContext stack to try to guess whether some other code might catch the exception. This is total garbage on a number of fronts, particularly because the XPCCallContext stack has no concept of saved frame chains, nested event loops, sandbox boundaries, origin boundaries, or any of the myriad of complicating factors that determine whether or not an exception will propagate. So we get rid of it. But this causes some crazy debugger tests to fail, because they rely on an exception from uriloader/exthandler/nsHandlerService.js getting squelched, and can't handle anybody reporting errors to the console service at the particular moment of contortionism when the exception is raised. So we need to introduce an explicit mechanism to disable the error reporter here to keep things running. Second, we have to be very careful about tracking the return status of the xpcshell binary. The old code would simply flag an error code if the error handler was invoked, and we can mostly continue to do that. But there are some complications. See the comments. Finally, we don't anything analogous in XPCShellEnvironment, because I have patches in bug 889714 to remove its state-dependence on the error reporter. I'll switch it to SystemErrorReporter in that bug.
2013-07-16 20:38:44 -07:00
ignoreReportedErrors(false);
}
function resolveResource(spec) {
var uri = Services.io.newURI(spec, null, null);
return Services.io.newURI(rph.resolveURI(uri), null, null);
}
function precompile_startupcache(uri) {
load_modules_under(uri, resolveResource(uri));
}