/* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Skywriter. * * The Initial Developer of the Original Code is * Mozilla. * Portions created by the Initial Developer are Copyright (C) 2009 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Kevin Dangoor (kdangoor@mozilla.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ define(function(require, exports, module) { var Promise = require("pilot/promise").Promise; exports.REASONS = { APP_STARTUP: 1, APP_SHUTDOWN: 2, PLUGIN_ENABLE: 3, PLUGIN_DISABLE: 4, PLUGIN_INSTALL: 5, PLUGIN_UNINSTALL: 6, PLUGIN_UPGRADE: 7, PLUGIN_DOWNGRADE: 8 }; exports.Plugin = function(name) { this.name = name; this.status = this.INSTALLED; }; exports.Plugin.prototype = { /** * constants for the state */ NEW: 0, INSTALLED: 1, REGISTERED: 2, STARTED: 3, UNREGISTERED: 4, SHUTDOWN: 5, install: function(data, reason) { var pr = new Promise(); if (this.status > this.NEW) { pr.resolve(this); return pr; } require([this.name], function(pluginModule) { if (pluginModule.install) { pluginModule.install(data, reason); } this.status = this.INSTALLED; pr.resolve(this); }.bind(this)); return pr; }, register: function(data, reason) { var pr = new Promise(); if (this.status != this.INSTALLED) { pr.resolve(this); return pr; } require([this.name], function(pluginModule) { if (pluginModule.register) { pluginModule.register(data, reason); } this.status = this.REGISTERED; pr.resolve(this); }.bind(this)); return pr; }, startup: function(data, reason) { reason = reason || exports.REASONS.APP_STARTUP; var pr = new Promise(); if (this.status != this.REGISTERED) { pr.resolve(this); return pr; } require([this.name], function(pluginModule) { if (pluginModule.startup) { pluginModule.startup(data, reason); } this.status = this.STARTED; pr.resolve(this); }.bind(this)); return pr; }, shutdown: function(data, reason) { if (this.status != this.STARTED) { return; } pluginModule = require(this.name); if (pluginModule.shutdown) { pluginModule.shutdown(data, reason); } } }; exports.PluginCatalog = function() { this.plugins = {}; }; exports.PluginCatalog.prototype = { registerPlugins: function(pluginList, data, reason) { var registrationPromises = []; pluginList.forEach(function(pluginName) { var plugin = this.plugins[pluginName]; if (plugin === undefined) { plugin = new exports.Plugin(pluginName); this.plugins[pluginName] = plugin; registrationPromises.push(plugin.register(data, reason)); } }.bind(this)); return Promise.group(registrationPromises); }, startupPlugins: function(data, reason) { var startupPromises = []; for (var pluginName in this.plugins) { var plugin = this.plugins[pluginName]; startupPromises.push(plugin.startup(data, reason)); } return Promise.group(startupPromises); } }; exports.catalog = new exports.PluginCatalog(); });