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, <[email protected]> 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); > + } > + } > +}; > > >
