You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by ig...@gmail.com on 2011/06/03 13:27:36 UTC

A gadget lifecycle registry for the container (issue4536097)

Reviewers: mhermanto1,

Message:
Mike, not sure if you saw this, so just wanted to make sure. This is the
code change to go along with this update to the container spec:
http://code.google.com/p/opensocial-resources/issues/detail?id=1185

Description:
Allows container components to register themselves and react to
preload/navigate/close/unload gadget events.

Allows features that rely on feature parameters(e.g. opensearch,
actions) to find out when gadgets are added, and react to their
contributions.

Please review this at http://codereview.appspot.com/4536097/

Affected files:
   features/src/main/javascript/features/container/container.js


Index: features/src/main/javascript/features/container/container.js
===================================================================
--- features/src/main/javascript/features/container/container.js	(revision  
1130245)
+++ features/src/main/javascript/features/container/container.js	(working  
copy)
@@ -29,8 +29,14 @@
   */
  osapi.container.Container = function(opt_config) {
    var config = opt_config || {};
-
+
    /**
+   * A list of object to be notified when gadgets are preloaded, navigated  
to or closed.
+   * @type {Array} array of callback objects, all of which have  
an "preloaded", "navigated", "closed" and "unloaded" methods.
+   * @private
+   */
+  this.gadgetLifecycleCallbacks_ = [];
+  /**
     * A JSON list of preloaded gadget URLs.
     * @type {Object}
     * @private
@@ -173,6 +179,7 @@
    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 +191,8 @@
      } else if  
(gadgetInfo[osapi.container.MetadataResponse.NEEDS_TOKEN_REFRESH]) {
        self.scheduleRefreshTokens_();
      }
+
+    self.applyLifecycleCallbacks_("navigated", selfSite);
      callback(gadgetInfo);
    });
  };
@@ -198,10 +207,31 @@
    site.close();
    delete this.sites_[id];
    this.unscheduleRefreshTokens_();
+  this.applyLifecycleCallbacks_("closed", site);
  };


  /**
+ * 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
+ */
+osapi.container.Container.prototype.addGadgetLifecycleCallback =  
function(lifeCycleCallback) {
+  this.gadgetLifecycleCallbacks_.push(lifeCycleCallback);
+};
+
+/**
+ * remove a lifecycle callback previously registered with the container
+ * @param {Object} callback object to be removed
+ */
+osapi.container.Container.prototype.removeGadgetLifecycleCallback =  
function(lifeCycleCallback) {
+  for (index in this.gadgetLifecycleCallbacks_) {
+     if(this.gadgetLifecycleCallbacks_[index]==lifeCycleCallback) {
+       this.gadgetLifecycleCallbacks_.splice(index,1);
+     }
+   }
+};
+
+/**
   * 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 +256,9 @@
    this.refreshService_();
    this.service_.getGadgetMetadata(request, function(response) {
      self.addPreloadGadgets_(response);
+    self.applyLifecycleCallbacks_("preloaded", response);
      callback(response);
+
    });
  };

@@ -248,6 +280,7 @@
    for (var i = 0; i < gadgetUrls.length; i++) {
      var url = gadgetUrls[i];
      delete this.preloadedGadgetUrls_[url];
+    this.applyLifecycleCallbacks_("unloaded", url);
    }
  };

@@ -624,3 +657,19 @@
      }
    });
  };
+
+
+/**
+ * invokes methods on the gadget lifecycle callback registered with the  
container.
+ * @param {methodName} name of the callback method to be called.
+ * @param {data} data to be passed to the callback method
+ * @private
+ */
+
+osapi.container.Container.prototype.applyLifecycleCallbacks_=function(methodName,  
data)  
{
+  for (index in this.gadgetLifecycleCallbacks_) {
+    if (this.gadgetLifecycleCallbacks_[index][methodName]!=null) {
+      this.gadgetLifecycleCallbacks_[index][methodName](data);
+    }
+  }
+};



Re: A gadget lifecycle registry for the container (issue4536097)

Posted by Andrew Davis <an...@gmail.com>.
Paul, Mike,

Can we move this code review along?  we have Declarative actions and
opensearch patches all dependent on this before we can send them out for
review.

--Andrew

On Fri, Jun 3, 2011 at 7:27 AM, <ig...@gmail.com> wrote:

> Reviewers: mhermanto1,
>
> Message:
> Mike, not sure if you saw this, so just wanted to make sure. This is the
> code change to go along with this update to the container spec:
> http://code.google.com/p/opensocial-resources/issues/detail?id=1185
>
> Description:
> Allows container components to register themselves and react to
> preload/navigate/close/unload gadget events.
>
> Allows features that rely on feature parameters(e.g. opensearch,
> actions) to find out when gadgets are added, and react to their
> contributions.
>
> Please review this at http://codereview.appspot.com/4536097/
>
> Affected files:
>  features/src/main/javascript/features/container/container.js
>
>
> Index: features/src/main/javascript/features/container/container.js
> ===================================================================
> --- features/src/main/javascript/features/container/container.js
>  (revision 1130245)
> +++ features/src/main/javascript/features/container/container.js
>  (working copy)
> @@ -29,8 +29,14 @@
>  */
>  osapi.container.Container = function(opt_config) {
>   var config = opt_config || {};
> -
> +
>   /**
> +   * A list of object to be notified when gadgets are preloaded, navigated
> to or closed.
> +   * @type {Array} array of callback objects, all of which have an
> "preloaded", "navigated", "closed" and "unloaded" methods.
> +   * @private
> +   */
> +  this.gadgetLifecycleCallbacks_ = [];
> +  /**
>    * A JSON list of preloaded gadget URLs.
>    * @type {Object}
>    * @private
> @@ -173,6 +179,7 @@
>   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 +191,8 @@
>     } else if
> (gadgetInfo[osapi.container.MetadataResponse.NEEDS_TOKEN_REFRESH]) {
>       self.scheduleRefreshTokens_();
>     }
> +
> +    self.applyLifecycleCallbacks_("navigated", selfSite);
>     callback(gadgetInfo);
>   });
>  };
> @@ -198,10 +207,31 @@
>   site.close();
>   delete this.sites_[id];
>   this.unscheduleRefreshTokens_();
> +  this.applyLifecycleCallbacks_("closed", site);
>  };
>
>
>  /**
> + * 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
> + */
> +osapi.container.Container.prototype.addGadgetLifecycleCallback =
> function(lifeCycleCallback) {
> +  this.gadgetLifecycleCallbacks_.push(lifeCycleCallback);
> +};
> +
> +/**
> + * remove a lifecycle callback previously registered with the container
> + * @param {Object} callback object to be removed
> + */
> +osapi.container.Container.prototype.removeGadgetLifecycleCallback =
> function(lifeCycleCallback) {
> +  for (index in this.gadgetLifecycleCallbacks_) {
> +     if(this.gadgetLifecycleCallbacks_[index]==lifeCycleCallback) {
> +       this.gadgetLifecycleCallbacks_.splice(index,1);
> +     }
> +   }
> +};
> +
> +/**
>  * 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 +256,9 @@
>   this.refreshService_();
>   this.service_.getGadgetMetadata(request, function(response) {
>     self.addPreloadGadgets_(response);
> +    self.applyLifecycleCallbacks_("preloaded", response);
>     callback(response);
> +
>   });
>  };
>
> @@ -248,6 +280,7 @@
>   for (var i = 0; i < gadgetUrls.length; i++) {
>     var url = gadgetUrls[i];
>     delete this.preloadedGadgetUrls_[url];
> +    this.applyLifecycleCallbacks_("unloaded", url);
>   }
>  };
>
> @@ -624,3 +657,19 @@
>     }
>   });
>  };
> +
> +
> +/**
> + * invokes methods on the gadget lifecycle callback registered with the
> container.
> + * @param {methodName} name of the callback method to be called.
> + * @param {data} data to be passed to the callback method
> + * @private
> + */
> +
> +osapi.container.Container.prototype.applyLifecycleCallbacks_=function(methodName,
> data) {
> +  for (index in this.gadgetLifecycleCallbacks_) {
> +    if (this.gadgetLifecycleCallbacks_[index][methodName]!=null) {
> +      this.gadgetLifecycleCallbacks_[index][methodName](data);
> +    }
> +  }
> +};
>
>
>