You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by mh...@apache.org on 2011/06/09 02:11:23 UTC
svn commit: r1133607 - in
/shindig/trunk/features/src/main/javascript/features/container: constant.js
container.js
Author: mhermanto
Date: Thu Jun 9 00:11:23 2011
New Revision: 1133607
URL: http://svn.apache.org/viewvc?rev=1133607&view=rev
Log:
A gadget lifecycle registry for the container.
http://codereview.appspot.com/4536097/
Thanks to igor1x@gmail.com.
Modified:
shindig/trunk/features/src/main/javascript/features/container/constant.js
shindig/trunk/features/src/main/javascript/features/container/container.js
Modified: shindig/trunk/features/src/main/javascript/features/container/constant.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/constant.js?rev=1133607&r1=1133606&r2=1133607&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/constant.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/constant.js Thu Jun 9 00:11:23 2011
@@ -139,3 +139,12 @@ osapi.container.RenderParam = {
osapi.container.ViewParam = {
VIEW: 'view'
};
+
+/**
+ * Constants to define lifecycle callback
+ */
+osapi.container.CallbackType = {};
+osapi.container.CallbackType.ON_PRELOADED = 'onPreloaded';
+osapi.container.CallbackType.ON_NAVIGATED = 'onNavigated';
+osapi.container.CallbackType.ON_CLOSED = 'onClosed';
+osapi.container.CallbackType.ON_UNLOADED = 'onUnloaded';
Modified: shindig/trunk/features/src/main/javascript/features/container/container.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container/container.js?rev=1133607&r1=1133606&r2=1133607&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/container.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/container.js Thu Jun 9 00:11:23 2011
@@ -29,7 +29,25 @@
*/
osapi.container.Container = function(opt_config) {
var config = opt_config || {};
-
+
+ /**
+ * A list of objects containing functions to be invoked when gadgets are
+ * preloaded, navigated, closed or unloaded. Sample object:
+ *
+ * var callback = new Object();
+ * callback[osapi.container.CallbackType.ON_PRELOADED]
+ * = function(response){};
+ * callback[osapi.container.CallbackType.ON_CLOSED]
+ * = function(gadgetSite){};
+ * callback[osapi.container.CallbackType.ON_NAVIGATED]
+ * = function(gadgetSite){};
+ * callback[osapi.container.CallbackType.ON_UNLOADED]
+ * = function(gadgetURL){};
+ * @type {Array}
+ * @private
+ */
+ this.gadgetLifecycleCallbacks_ = {};
+
/**
* A JSON list of preloaded gadget URLs.
* @type {Object}
@@ -173,6 +191,7 @@ osapi.container.Container.prototype.navi
this.refreshService_();
var self = this;
+ var selfSite = site;
// TODO: Lifecycle, add ability for current gadget to cancel nav.
site.navigateTo(gadgetUrl, viewParams, renderParams, function(gadgetInfo) {
// TODO: Navigate to error screen on primary gadget load failure
@@ -184,6 +203,9 @@ osapi.container.Container.prototype.navi
} else if (gadgetInfo[osapi.container.MetadataResponse.NEEDS_TOKEN_REFRESH]) {
self.scheduleRefreshTokens_();
}
+
+ self.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_NAVIGATED,
+ selfSite);
callback(gadgetInfo);
});
};
@@ -195,6 +217,7 @@ osapi.container.Container.prototype.navi
*/
osapi.container.Container.prototype.closeGadget = function(site) {
var id = site.getId();
+ this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_CLOSED, site);
site.close();
delete this.sites_[id];
this.unscheduleRefreshTokens_();
@@ -202,6 +225,28 @@ osapi.container.Container.prototype.clos
/**
+ * Add a callback to be called when one or more gadgets are preloaded, navigated to or closed.
+ * @param {Object} callback object to call back when a gadget is preloaded, navigated to or closed.
+ * called via preloaded, navigated and closed methods
+ * @return true if added successfully, false if a callback with that name is already registered.
+ */
+osapi.container.Container.prototype.addGadgetLifecycleCallback = function(name, lifeCycleCallback) {
+ if (!this.gadgetLifecycleCallbacks_[name]) {
+ this.gadgetLifecycleCallbacks_[name] = lifeCycleCallback;
+ return true;
+ }
+ return false;
+};
+
+/**
+ * remove a lifecycle callback previously registered with the container
+ * @param {Object} callback object to be removed
+ */
+osapi.container.Container.prototype.removeGadgetLifecycleCallback = function(name) {
+ delete this.gadgetLifecycleCallbacks_[name];
+};
+
+/**
* Pre-load one gadget metadata information. More details on preloadGadgets().
* @param {string} gadgetUrl gadget URI to preload.
* @param {function(Object)=} opt_callback function to call upon data receive.
@@ -226,7 +271,9 @@ osapi.container.Container.prototype.prel
this.refreshService_();
this.service_.getGadgetMetadata(request, function(response) {
self.addPreloadGadgets_(response);
- callback(response);
+ self.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_PRELOADED,
+ response);
+ callback(response);
});
};
@@ -248,6 +295,8 @@ osapi.container.Container.prototype.unlo
for (var i = 0; i < gadgetUrls.length; i++) {
var url = gadgetUrls[i];
delete this.preloadedGadgetUrls_[url];
+ this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_UNLOADED,
+ url);
}
};
@@ -365,7 +414,8 @@ osapi.container.ContainerConfig.NAVIGATE
/**
* Provide server reference time for preloaded data.
- * This time is used instead of each response time in order to support server caching of results.
+ * This time is used instead of each response time in order to support server
+ * caching of results.
* @type {number}
* @const
*/
@@ -462,7 +512,8 @@ osapi.container.Container.prototype.refr
/**
- * @param {string} iframeId Iframe ID of gadget holder contained in the gadget site to get.
+ * @param {string} iframeId Iframe ID of gadget holder contained in the gadget
+ * site to get.
* @return {osapi.container.GadgetSite} The gadget site.
* @private
*/
@@ -617,7 +668,8 @@ osapi.container.Container.prototype.refr
if (gadgetInfo[osapi.container.MetadataResponse.NEEDS_TOKEN_REFRESH]) {
var tokenInfo = response[holder.getUrl()];
if (tokenInfo.error) {
- gadgets.warn(['Failed to get token for gadget ', holder.getUrl(), '.'].join(''));
+ gadgets.warn(['Failed to get token for gadget ',
+ holder.getUrl(), '.'].join(''));
} else {
gadgets.rpc.call(holder.getIframeId(), 'update_security_token', null,
tokenInfo[osapi.container.TokenResponse.TOKEN]);
@@ -626,3 +678,21 @@ osapi.container.Container.prototype.refr
}
});
};
+
+
+/**
+ * invokes methods on the gadget lifecycle callback registered with the
+ * container.
+ * @param {string} name of the callback method to be called.
+ * @param {Object} data to be passed to the callback method
+ * @private
+ */
+osapi.container.Container.prototype.applyLifecycleCallbacks_ = function(
+ methodName, data) {
+ for (name in this.gadgetLifecycleCallbacks_) {
+ var method = this.gadgetLifecycleCallbacks_[name][methodName];
+ if (method) {
+ method(data);
+ }
+ }
+};