Bug 888479 - Port osfile_shared_allthreads.jsm and dependents to worker module loader. r=froydnj

This commit is contained in:
David Rajchenbach-Teller 2013-07-09 09:09:16 -04:00
parent b07bacbd43
commit 5f4d724ed4
12 changed files with 1142 additions and 1052 deletions

View File

@ -15,7 +15,7 @@ if (typeof Components != "undefined") {
// what looks like a nested event loop bug (see bug 794091).
#ifdef XP_WIN
importScripts(
"resource://gre/modules/osfile/osfile_shared_allthreads.jsm",
"resource://gre/modules/workers/require.js",
"resource://gre/modules/osfile/osfile_win_allthreads.jsm",
"resource://gre/modules/osfile/ospath_win_back.jsm",
"resource://gre/modules/osfile/osfile_win_back.jsm",
@ -24,7 +24,7 @@ if (typeof Components != "undefined") {
);
#else
importScripts(
"resource://gre/modules/osfile/osfile_shared_allthreads.jsm",
"resource://gre/modules/workers/require.js",
"resource://gre/modules/osfile/osfile_unix_allthreads.jsm",
"resource://gre/modules/osfile/ospath_unix_back.jsm",
"resource://gre/modules/osfile/osfile_unix_back.jsm",

View File

@ -21,13 +21,15 @@
this.EXPORTED_SYMBOLS = ["OS"];
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", this);
let SharedAll = {};
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", SharedAll);
// Boilerplate, to simplify the transition to require()
let OS = SharedAll.OS;
let LOG = OS.Shared.LOG.bind(OS.Shared, "Controller");
let isTypedArray = OS.Shared.isTypedArray;
// A simple flag used to control debugging messages.
let DEBUG = OS.Shared.DEBUG;
let isTypedArray = OS.Shared.isTypedArray;
// The constructor for file errors.
let OSError;
@ -155,23 +157,48 @@ let Scheduler = {
}
};
// Update worker's DEBUG flag if it's true.
if (DEBUG === true) {
Scheduler.post("SET_DEBUG", [DEBUG]);
}
const PREF_OSFILE_LOG = "toolkit.osfile.log";
const PREF_OSFILE_LOG_REDIRECT = "toolkit.osfile.log.redirect";
// Define a new getter and setter for OS.Shared.DEBUG to be able to watch
// for changes to it and update worker's DEBUG accordingly.
Object.defineProperty(OS.Shared, "DEBUG", {
configurable: true,
get: function () {
return DEBUG;
},
set: function (newVal) {
Scheduler.post("SET_DEBUG", [newVal]);
DEBUG = newVal;
}
});
/**
* Safely read a PREF_OSFILE_LOG preference.
* Returns a value read or, in case of an error, oldPref or false.
*
* @param bool oldPref
* An optional value that the DEBUG flag was set to previously.
*/
let readDebugPref = function readDebugPref(prefName, oldPref = false) {
let pref = oldPref;
try {
pref = Services.prefs.getBoolPref(prefName);
} catch (x) {
// In case of an error when reading a pref keep it as is.
}
// If neither pref nor oldPref were set, default it to false.
return pref;
};
/**
* Listen to PREF_OSFILE_LOG changes and update gShouldLog flag
* appropriately.
*/
Services.prefs.addObserver(PREF_OSFILE_LOG,
function prefObserver(aSubject, aTopic, aData) {
OS.Shared.DEBUG = readDebugPref(PREF_OSFILE_LOG, OS.Shared.DEBUG);
Scheduler.post("SET_DEBUG", [OS.Shared.DEBUG]);
}, false);
OS.Shared.DEBUG = readDebugPref(PREF_OSFILE_LOG, false);
Services.prefs.addObserver(PREF_OSFILE_LOG_REDIRECT,
function prefObserver(aSubject, aTopic, aData) {
OS.Shared.TEST = readDebugPref(PREF_OSFILE_LOG_REDIRECT, OS.Shared.TEST);
}, false);
OS.Shared.TEST = readDebugPref(PREF_OSFILE_LOG_REDIRECT, false);
// Update worker's DEBUG flag if it's true.
if (OS.Shared.DEBUG === true) {
Scheduler.post("SET_DEBUG", [true]);
}
// Observer topics used for monitoring shutdown
const WEB_WORKERS_SHUTDOWN_TOPIC = "web-workers-shutdown";

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,8 @@ if (typeof Components != "undefined") {
}
(function(exports) {
exports.OS = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm").OS;
let LOG = exports.OS.Shared.LOG.bind(OS.Shared, "Shared front-end");
/**

View File

@ -17,22 +17,27 @@
* - opened from a chrome worker through importScripts.
*/
let SharedAll;
if (typeof Components != "undefined") {
// Module is opened as a jsm module
this.EXPORTED_SYMBOLS = ["OS"];
Components.utils.import("resource://gre/modules/ctypes.jsm");
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", this);
SharedAll = {};
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", SharedAll);
} else {
SharedAll = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm");
}
(function(exports) {
"use strict";
if (!exports.OS || !exports.OS.Shared) {
throw new Error("osfile_unix_allthreads.jsm must be loaded after osfile_shared_allthreads.jsm");
}
if (exports.OS.Shared.Unix) {
if ("OS" in exports && "Shared" in exports.OS && "Unix" in exports.OS.Shared) {
// Avoid double inclusion
return;
}
exports.OS = SharedAll.OS;
exports.OS.Shared.Unix = {};
let LOG = OS.Shared.LOG.bind(OS.Shared, "Unix", "allthreads");

View File

@ -13,15 +13,12 @@
}
(function(exports) {
"use strict";
if (!exports.OS) {
exports.OS = {};
}
if (!exports.OS.Unix) {
exports.OS.Unix = {};
}
if (exports.OS.Unix.File) {
return; // Avoid double-initialization
if (exports.OS && exports.OS.Unix && exports.OS.Unix.File) {
return; // Avoid double initialization
}
exports.OS = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm").OS;
exports.OS.Unix.File = {};
let LOG = exports.OS.Shared.LOG.bind(OS.Shared, "Unix", "back");

View File

@ -19,10 +19,12 @@
(function(exports) {
"use strict";
exports.OS = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm").OS;
// exports.OS.Unix is created by osfile_unix_back.jsm
if (exports.OS.File) {
if (exports.OS && exports.OS.File) {
return; // Avoid double-initialization
}
exports.OS.Unix.File._init();
let Const = exports.OS.Constants.libc;
let UnixFile = exports.OS.Unix.File;

View File

@ -17,22 +17,25 @@
* - opened from a chrome worker through importScripts.
*/
let SharedAll;
if (typeof Components != "undefined") {
// Module is opened as a jsm module
this.EXPORTED_SYMBOLS = ["OS"];
Components.utils.import("resource://gre/modules/ctypes.jsm");
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", this);
SharedAll = {};
Components.utils.import("resource://gre/modules/osfile/osfile_shared_allthreads.jsm", SharedAll);
} else {
SharedAll = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm");
}
(function(exports) {
"use strict";
if (!exports.OS || !exports.OS.Shared) {
throw new Error("osfile_win_allthreads.jsm must be loaded after osfile_shared_allthreads.jsm");
}
if (exports.OS.Shared.Win) {
if (exports.OS && exports.OS.Shared && exports.OS.Shared.Win) {
// Avoid double inclusion
return;
}
exports.OS = SharedAll.OS;
exports.OS.Shared.Win = {};
let LOG = OS.Shared.LOG.bind(OS.Shared, "Win", "allthreads");

View File

@ -31,15 +31,10 @@
(function(exports) {
"use strict";
if (!exports.OS) {
exports.OS = {};
}
if (!exports.OS.Win) {
exports.OS.Win = {};
}
if (exports.OS.Win.File) {
return; // Avoid double-initialization
if (exports.OS && exports.OS.Win && exports.OS.Win.File) {
return; // Avoid double initialization
}
exports.OS = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm").OS;
exports.OS.Win.File = {};
let LOG = OS.Shared.LOG.bind(OS.Shared, "Win", "back");

View File

@ -19,10 +19,12 @@
(function(exports) {
"use strict";
// exports.OS.Win is created by osfile_win_back.jsm
if (exports.OS.File) {
return; // Avoid double-initialization
exports.OS = require("resource://gre/modules/osfile/osfile_shared_allthreads.jsm").OS;
// exports.OS.Win is created by osfile_win_back.jsm
if (exports.OS && exports.OS.File) {
return; // Avoid double-initialization
}
exports.OS.Win.File._init();
let Const = exports.OS.Constants.Win;
let WinFile = exports.OS.Win.File;

View File

@ -134,6 +134,14 @@ let reference_dir_contents = function reference_dir_contents(path) {
return result;
};
// Set/Unset OS.Shared.DEBUG, OS.Shared.TEST and a console listener.
function toggleDebugTest (pref, consoleListener) {
Services.prefs.setBoolPref("toolkit.osfile.log", pref);
Services.prefs.setBoolPref("toolkit.osfile.log.redirect", pref);
Services.console[pref ? "registerListener" : "unregisterListener"](
consoleListener);
}
let test = maketest("Main", function main(test) {
return Task.spawn(function() {
SimpleTest.waitForExplicitFinish();
@ -813,24 +821,13 @@ let test_debug_test = maketest("debug_test", function debug_test(test) {
if (aMessage.message.indexOf("TEST OS") < 0) {
return;
}
test.ok(true, "DEBUG TEST messages are logged correctly.")
test.ok(true, "DEBUG TEST messages are logged correctly.");
}
};
// Set/Unset OS.Shared.DEBUG, OS.Shared.TEST and the console listener.
function toggleDebugTest (pref) {
OS.Shared.DEBUG = pref;
OS.Shared.TEST = pref;
Services.console[pref ? "registerListener" : "unregisterListener"](
consoleListener);
}
// Save original DEBUG value.
let originalPref = OS.Shared.DEBUG;
toggleDebugTest(true);
toggleDebugTest(true, consoleListener);
// Execution of OS.File.exist method will trigger OS.File.LOG several times.
let fileExists = yield OS.File.exists(EXISTING_FILE);
toggleDebugTest(false);
// Restore DEBUG to its original.
OS.Shared.DEBUG = originalPref;
toggleDebugTest(false, consoleListener);
});
});
@ -839,8 +836,6 @@ let test_debug_test = maketest("debug_test", function debug_test(test) {
*/
let test_system_shutdown = maketest("system_shutdown", function system_shutdown(test) {
return Task.spawn(function () {
// Save original DEBUG value.
let originalDebug = OS.Shared.DEBUG;
// Count the number of times the leaks are logged.
let logCounter = 0;
// Create a console listener.
@ -854,10 +849,7 @@ let test_system_shutdown = maketest("system_shutdown", function system_shutdown(
// Unregister a listener, reset DEBUG and TEST both when the promise is
// resolved or rejected.
let cleanUp = function cleanUp() {
Services.console.unregisterListener(listener);
OS.Shared.DEBUG = originalDebug;
OS.Shared.TEST = false;
test.info("Unregistered listener for resource " + resource);
toggleDebugTest(false, listener);
};
waitObservation.promise.then(cleanUp, cleanUp);
@ -893,7 +885,7 @@ let test_system_shutdown = maketest("system_shutdown", function system_shutdown(
}
}
};
Services.console.registerListener(listener);
toggleDebugTest(true, listener);
logStart = Date.now();
f();
// If listener does not resolve webObservation in timely manner (1000MS),

View File

@ -11,6 +11,8 @@ function run_test() {
do_test_pending();
let messageCount = 0;
do_print("Test starting");
// Create a console listener.
let consoleListener = {
observe: function (aMessage) {
@ -18,30 +20,32 @@ function run_test() {
if (!(aMessage instanceof Components.interfaces.nsIConsoleMessage)) {
return;
}
if (aMessage.message.indexOf("TEST OS") < 0) {
return;
}
// This is required, as printing to the |Services.console|
// while in the observe function causes an exception.
do_execute_soon(function() {
do_print("Observing message " + aMessage.message);
if (aMessage.message.indexOf("TEST OS") < 0) {
return;
}
++messageCount;
if(messageCount == 1) {
do_check_eq(aMessage.message, "TEST OS {\"name\":\"test\"}\n");
}
if(messageCount == 2) {
do_check_eq(aMessage.message, "TEST OS name is test\n");
// This is required, as printing to the |Services.console|
// while in the observe function causes an exception.
do_execute_soon(function() {
++messageCount;
if(messageCount == 1) {
do_check_eq(aMessage.message, "TEST OS {\"name\":\"test\"}\n");
}
if(messageCount == 2) {
do_check_eq(aMessage.message, "TEST OS name is test\n");
toggleConsoleListener(false);
do_test_finished();
});
}
}
});
}
};
// Set/Unset the console listener.
function toggleConsoleListener (pref) {
OS.Shared.DEBUG = pref;
OS.Shared.TEST = pref;
do_print("Setting console listener: " + pref);
Services.prefs.setBoolPref("toolkit.osfile.log", pref);
Services.prefs.setBoolPref("toolkit.osfile.log.redirect", pref);
Services.console[pref ? "registerListener" : "unregisterListener"](
consoleListener);
}
@ -51,12 +55,18 @@ function run_test() {
let objectDefault = {name: "test"};
let CustomToString = function() {
this.name = "test";
}
};
CustomToString.prototype.toString = function() {
return "name is " + this.name;
}
};
let objectCustom = new CustomToString();
do_print(OS.Shared.LOG.toSource());
do_print("Logging 1");
OS.Shared.LOG(objectDefault);
do_print("Logging 2");
OS.Shared.LOG(objectCustom);
// Once both messages are observed OS.Shared.DEBUG, and OS.Shared.TEST
// are reset to false.