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);
+    }
+  } 
+};