diff options
Diffstat (limited to 'tools/addon-sdk-1.3/packages/api-utils/lib/unload.js')
-rw-r--r-- | tools/addon-sdk-1.3/packages/api-utils/lib/unload.js | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.3/packages/api-utils/lib/unload.js b/tools/addon-sdk-1.3/packages/api-utils/lib/unload.js new file mode 100644 index 0000000..3bbeb38 --- /dev/null +++ b/tools/addon-sdk-1.3/packages/api-utils/lib/unload.js @@ -0,0 +1,59 @@ +// Parts of this module were taken from narwhal: +// +// http://narwhaljs.org + +var observers = []; +var unloaders = []; + +var when = exports.when = function when(observer) { + if (observers.indexOf(observer) != -1) + return; + observers.unshift(observer); +}; + +var send = exports.send = function send(reason, onError) { + onError = onError || console.exception; + observers.forEach(function (observer) { + try { + observer(reason); + } catch (e) { + onError(e); + } + }); +}; + +var ensure = exports.ensure = function ensure(obj, destructorName) { + if (!destructorName) + destructorName = "unload"; + if (!(destructorName in obj)) + throw new Error("object has no '" + destructorName + "' property"); + + let called = false; + let originalDestructor = obj[destructorName]; + + function unloadWrapper(reason) { + if (!called) { + called = true; + let index = unloaders.indexOf(unloadWrapper); + if (index == -1) + throw new Error("internal error: unloader not found"); + unloaders.splice(index, 1); + originalDestructor.call(obj, reason); + originalDestructor = null; + destructorName = null; + obj = null; + } + }; + + unloaders.push(unloadWrapper); + + obj[destructorName] = unloadWrapper; +}; + +when( + function(reason) { + unloaders.slice().forEach( + function(unloadWrapper) { + unloadWrapper(reason); + }); + }); |