Author: rbaxter85
Date: Mon Nov 21 21:06:26 2011
New Revision: 1204704

URL: http://svn.apache.org/viewvc?rev=1204704&view=rev
Log:
SHINDIG-1653
Add additional lifecycle handlers.      

Modified:
    shindig/trunk/content/samplecontainer/examples/commoncontainer/assembler.js
    
shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js
    
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/iframe.js
    
shindig/trunk/features/src/main/javascript/features/actions/actions_container.js
    
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_holder.js
    
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_site.js
    
shindig/trunk/features/src/main/javascript/features/container.util/constant.js
    shindig/trunk/features/src/main/javascript/features/container/container.js
    shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js
    
shindig/trunk/features/src/main/javascript/features/shared-script-frame/shared-script-frame-container.js
    
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js

Modified: 
shindig/trunk/content/samplecontainer/examples/commoncontainer/assembler.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/content/samplecontainer/examples/commoncontainer/assembler.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- shindig/trunk/content/samplecontainer/examples/commoncontainer/assembler.js 
(original)
+++ shindig/trunk/content/samplecontainer/examples/commoncontainer/assembler.js 
Mon Nov 21 21:06:26 2011
@@ -59,6 +59,7 @@ CommonContainer.init = function() {
   });
 
   CommonContainer.rpcRegister('set_title', setTitleHandler);
+  CommonContainer.addGadgetLifecycleCallback('com.example.commoncontainer', 
lifecycle());
 
   try {
 
@@ -116,3 +117,45 @@ function log(message) {
   document.getElementById('output').innerHTML = 
gadgets.util.escapeString(message) + '<br/>' + 
document.getElementById('output').innerHTML;
 }
 
+var lifecycle = function() {
+  var preloadStart;
+  var navigateStart;
+  var closeStart;
+  var unloadStart;
+  var renderStart;
+  var listeners = {};
+  listeners[osapi.container.CallbackType.ON_BEFORE_PRELOAD] = 
function(gadgetUrls) {
+    preloadStart = osapi.container.util.getCurrentTimeMs();
+  };
+  listeners[osapi.container.CallbackType.ON_PRELOADED] = function(response) {
+    var urls = [];
+    for(url in response) {
+      urls[urls.length] = url;
+    }
+    var dif = osapi.container.util.getCurrentTimeMs() - preloadStart;
+    log('It took ' + dif + 'ms to preload the URL(s) ' + urls + '.');
+  };
+  listeners[osapi.container.CallbackType.ON_BEFORE_NAVIGATE] = 
function(gadgetUrl) {
+    navigateStart = osapi.container.util.getCurrentTimeMs();
+  };
+  listeners[osapi.container.CallbackType.ON_NAVIGATED] = function(site) {
+   log('It took ' + (osapi.container.util.getCurrentTimeMs() - navigateStart) 
+ ' ms' +
+           ' for the site ' + site.getId() + ' to navigate.');
+  };
+  listeners[osapi.container.CallbackType.ON_BEFORE_CLOSE] = function(site) {
+    closeStart = osapi.container.util.getCurrentTimeMs();
+  };
+  listeners[osapi.container.CallbackType.ON_CLOSED] = function(site) {
+    log('It took ' + (osapi.container.util.getCurrentTimeMs() - closeStart) +
+            ' ms to close the gadget in the site with id ' + site.getId());
+  };
+  listeners[osapi.container.CallbackType.ON_BEFORE_RENDER] = 
function(gadgetUrl) {
+    renderStart = osapi.container.util.getCurrentTimeMs();
+  };
+  listeners[osapi.container.CallbackType.ON_RENDER] = function(gadgetUrl) {
+    log('It took ' + (osapi.container.util.getCurrentTimeMs() - renderStart) +
+            ' ms to render the gadget at the URL ' + gadgetUrl);
+  };
+  return listeners;
+}
+

Modified: 
shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js
 (original)
+++ 
shindig/trunk/content/samplecontainer/examples/commoncontainer/viewController.js
 Mon Nov 21 21:06:26 2011
@@ -75,18 +75,21 @@ $(function() {
 
     //handle gadget collapse, expand, and remove gadget actions
     handleNavigateAction = function(portlet,gadgetSite,gadgetURL,actionId) {
-                //remove button was click, remove the portlet/gadget
-                if (actionId === 'remove') {
-                       if (confirm('This gadget will be removed, ok?')) {
-                         portlet.remove();
-                         delete siteToTitleMap[gadgetSite.getId()];
-                   }
-                }else if (actionId === 'expand') {
-                       //navigate to currentView prior to colapse gadget
-                       CommonContainer.navigateView(gadgetSite, gadgetURL, 
currentView);
-            }else if (actionId === 'collapse') {
-               CommonContainer.colapseGadget(gadgetSite);
-                }
+      //remove button was click, remove the portlet/gadget
+      if(typeof gadgetSite !== 'undefined'){
+        if (actionId === 'remove') {
+          if (confirm('This gadget will be removed, ok?')) {
+            CommonContainer.closeGadget(gadgetSite);
+            portlet.remove();
+            delete siteToTitleMap[gadgetSite.getId()];
+          }
+        }else if (actionId === 'expand') {
+          //navigate to currentView prior to colapse gadget
+          CommonContainer.navigateView(gadgetSite, gadgetURL, currentView);
+        }else if (actionId === 'collapse') {
+          CommonContainer.colapseGadget(gadgetSite);
+        }
+      }
     };
 
     //RPC handler for the set-title feature

Modified: 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/iframe.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/iframe.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/iframe.js
 (original)
+++ 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/iframe.js
 Mon Nov 21 21:06:26 2011
@@ -388,10 +388,20 @@ OpenAjax.hub.IframeContainer = function(
         if ( internalID !== clientID ) {
             idText = "&oahId=" + internalID.substring( 
internalID.lastIndexOf('_') + 1 );
         }
-        document.getElementById( internalID ).src = params.IframeContainer.uri 
+
+
+        var iframe = document.getElementById( internalID );
+        if(iframe.attachEvent) {
+          //Works for IE
+          iframe.attachEvent('onload', function(){
+            window[params.IframeContainer.onGadgetLoad]();
+          });
+        } else {
+          iframe.onload = 
function(){window[params.IframeContainer.onGadgetLoad]();};
+        }
+        iframe.src = params.IframeContainer.uri +
                 "#rpctoken=" + securityToken + tunnelText + idText;
     }
-    
+
     // If the relay iframe used by RPC has not been loaded yet, then we won't 
have unload protection
     // at this point.  Since we can't detect when the relay iframe has loaded, 
we use a two stage
     // connection process.  First, the child sends a connection msg and the 
container sends an ack.

Modified: 
shindig/trunk/features/src/main/javascript/features/actions/actions_container.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/actions/actions_container.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/actions/actions_container.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/actions/actions_container.js
 Mon Nov 21 21:06:26 2011
@@ -553,7 +553,7 @@
     preloadCallback;
   actionsLifecycleCallback[osapi.container.CallbackType.ON_NAVIGATED] =
     navigatedCallback;
-  actionsLifecycleCallback[osapi.container.CallbackType.ON_CLOSED] =
+  actionsLifecycleCallback[osapi.container.CallbackType.ON_BEFORE_CLOSE] =
     closedCallback;
   actionsLifecycleCallback[osapi.container.CallbackType.ON_UNLOADED] =
     unloadedCallback;

Modified: 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_holder.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_holder.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_holder.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_holder.js
 Mon Nov 21 21:06:26 2011
@@ -25,9 +25,10 @@
 /**
  * @param {number} siteId The id of site containing this holder.
  * @param {Element} el The element to render gadgets in.
+ * @param {string} onGadgetLoad The name of the on load function
  * @constructor
  */
-osapi.container.GadgetHolder = function(siteId, el) {
+osapi.container.GadgetHolder = function(siteId, el, onGadgetLoad) {
   /**
    * Unique numeric gadget ID.
    * @type {number}
@@ -79,6 +80,13 @@ osapi.container.GadgetHolder = function(
    */
   this.securityToken_ = null;
 
+  /**
+   * On load function for gadget iFrames.
+   * @type {string}
+   * @private
+   */
+  this.onGadgetLoad_ = onGadgetLoad;
+
   this.onConstructed();
 };
 
@@ -259,7 +267,8 @@ osapi.container.GadgetHolder.prototype.d
           //tunnelURI: shindig.uri('/test1/gadgets/' + 
'../container/rpc_relay.html')
           //   .resolve(shindig.uri(window.location.href)),
           tunnelURI: 
shindig.uri(this.relayPath_).resolve(shindig.uri(window.location.href)),
-          iframeAttrs: iframeParams
+          iframeAttrs: iframeParams,
+          onGadgetLoad: this.onGadgetLoad_
         }
       }
   );
@@ -304,7 +313,7 @@ osapi.container.GadgetHolder.prototype.g
     'height': this.renderParams_[osapi.container.RenderParam.HEIGHT],
     'width': this.renderParams_[osapi.container.RenderParam.WIDTH]
   };
-
+  this.addOnLoad_(iframeParams);
   return osapi.container.util.createIframeHtml(iframeParams);
 };
 
@@ -372,6 +381,17 @@ osapi.container.GadgetHolder.prototype.u
   }
 };
 
+/**
+ * Adds an onload attribute if a callback is available.
+ * @param {Object} iframeParams The iFrames parameters.
+ * @private
+ */
+osapi.container.GadgetHolder.prototype.addOnLoad_ = function(iframeParams) {
+  iframeParams['onload'] = 'window.' + this.onGadgetLoad_ +
+  "('" + this.getUrl() + "');";
+
+};
+
 function init(config) {
   if (config['container']) {
     var rpath = config['container']['relayPath'];

Modified: 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_site.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_site.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_site.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/container.gadget/gadget_site.js
 Mon Nov 21 21:06:26 2011
@@ -64,6 +64,12 @@ osapi.container.GadgetSite = function(ar
   this.loadingGadgetEl_ = args['bufferEl'];
 
   /**
+   * @type {string}
+   * @private
+   */
+  this.gadgetOnLoad_ = args['gadgetOnLoad']
+
+  /**
    * Unique ID of this site.  Uses the ID of the gadgetEl, if set, or an 
auto-generated number.
    * @type {string}
    * @private
@@ -210,7 +216,8 @@ osapi.container.GadgetSite.prototype.nav
       var message = ['Failed to navigate for gadget ', gadgetUrl, 
'.'].join('');
       osapi.container.util.warn(message);
     } else {
-      
self.container_.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_RENDER,
 gadgetInfo);
+      
self.container_.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_BEFORE_RENDER,
+              gadgetInfo);
       self.render(gadgetInfo, viewParams, renderParams);
     }
 
@@ -311,7 +318,8 @@ osapi.container.GadgetSite.prototype.ren
 
   // Load into the double-buffer if there is one.
   var el = this.loadingGadgetEl_ || this.currentGadgetEl_;
-  this.loadingGadgetHolder_ = new osapi.container.GadgetHolder(this.id_, el);
+  this.loadingGadgetHolder_ = new osapi.container.GadgetHolder(this.id_, el,
+          this.gadgetOnLoad_);
 
   var localRenderParams = {};
   for (var key in renderParams) {

Modified: 
shindig/trunk/features/src/main/javascript/features/container.util/constant.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/container.util/constant.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/container.util/constant.js 
(original)
+++ 
shindig/trunk/features/src/main/javascript/features/container.util/constant.js 
Mon Nov 21 21:06:26 2011
@@ -146,9 +146,36 @@ osapi.container.ViewParam = {
  * @enum {string}
  */
 osapi.container.CallbackType = {
+    /** Called before a gadget(s) is preloaded. */
+    ON_BEFORE_PRELOAD: 'onBeforePreload',
+
+    /** Called after a gadget(s) has finished preloading. */
     ON_PRELOADED: 'onPreloaded',
+
+    /** Called before navigate is called. */
+    ON_BEFORE_NAVIGATE: 'onBeforeNavigate',
+
+    /** Called after navigation has completed. */
     ON_NAVIGATED: 'onNavigated',
+
+    /** Called before a gadget is closed. */
+    ON_BEFORE_CLOSE: 'onBeforeClose',
+
+    /** Called after a gadget has been closed. */
     ON_CLOSED: 'onClosed',
+
+    /** Called before a gadget has been unloaded. */
+    ON_BEFORE_UNLOAD: 'onBeforeUnload',
+
+    /** Called after a gadget has been unloaded. */
     ON_UNLOADED: 'onUnloaded',
-    ON_RENDER: 'onRender'
+
+    /** Called before render is called. */
+    ON_BEFORE_RENDER: 'onBeforeRender',
+
+    /** Called after a gadget has rendered. */
+    ON_RENDER: 'onRender',
+
+    /** Name of the global function all gadgets will call when they are 
loaded. */
+    GADGET_ON_LOAD: '__gadgetOnLoad'
 };

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=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/container.js 
(original)
+++ shindig/trunk/features/src/main/javascript/features/container/container.js 
Mon Nov 21 21:06:26 2011
@@ -143,6 +143,11 @@ osapi.container.Container = function(opt
    */
   this.tokenRefreshTimer_ = null;
 
+  var self = this;
+  window[osapi.container.CallbackType.GADGET_ON_LOAD] = function(gadgetUrl){
+      self.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_RENDER, 
gadgetUrl);
+  };
+
   this.initializeMixins_();
 
   this.setupRpcArbitrator_(config);
@@ -169,7 +174,8 @@ osapi.container.Container.prototype.newG
       'service' : this.service_,
       'navigateCallback' : this.navigateCallback_,
       'gadgetEl' : gadgetEl,
-      'bufferEl' : bufferEl
+      'bufferEl' : bufferEl,
+      'gadgetOnLoad' : osapi.container.CallbackType.GADGET_ON_LOAD
   });
   this.sites_[site.getId()] = site;
   return site;
@@ -212,7 +218,8 @@ osapi.container.Container.prototype.navi
     selfSite = site,
     finishNavigate = function(preferences) {
       renderParams[RenderParam.USER_PREFS] = preferences;
-
+      
self.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_BEFORE_NAVIGATE,
+              gadgetUrl);
       // 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
@@ -247,8 +254,9 @@ osapi.container.Container.prototype.navi
  */
 osapi.container.Container.prototype.closeGadget = function(site) {
   var id = site.getId();
-  this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_CLOSED, site);
+  this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_BEFORE_CLOSE, 
site);
   site.close();
+  this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_CLOSED, site);
   delete this.sites_[id];
   this.unscheduleRefreshTokens_();
 };
@@ -305,6 +313,7 @@ osapi.container.Container.prototype.prel
   var self = this;
 
   this.refreshService_();
+  
this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_BEFORE_PRELOAD, 
gadgetUrls);
   this.service_.getGadgetMetadata(request, function(response) {
     self.addPreloadGadgets_(response);
     self.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_PRELOADED,
@@ -330,6 +339,8 @@ osapi.container.Container.prototype.unlo
 osapi.container.Container.prototype.unloadGadgets = function(gadgetUrls) {
   for (var i = 0; i < gadgetUrls.length; i++) {
     var url = gadgetUrls[i];
+    
this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_BEFORE_UNLOAD,
+            url);
     delete this.preloadedGadgetUrls_[url];
     this.applyLifecycleCallbacks_(osapi.container.CallbackType.ON_UNLOADED,
         url);

Modified: 
shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js 
(original)
+++ 
shindig/trunk/features/src/main/javascript/features/opensearch/opensearch.js 
Mon Nov 21 21:06:26 2011
@@ -231,7 +231,7 @@
   var containerCallback = new Object();
   containerCallback[osapi.container.CallbackType.ON_PRELOADED] =
       preloaded;
-  containerCallback[osapi.container.CallbackType.ON_CLOSED] =
+  containerCallback[osapi.container.CallbackType.ON_BEFORE_CLOSE] =
       closed;
   containerCallback[osapi.container.CallbackType.ON_NAVIGATED] =
       navigated;

Modified: 
shindig/trunk/features/src/main/javascript/features/shared-script-frame/shared-script-frame-container.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/shared-script-frame/shared-script-frame-container.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/main/javascript/features/shared-script-frame/shared-script-frame-container.js
 (original)
+++ 
shindig/trunk/features/src/main/javascript/features/shared-script-frame/shared-script-frame-container.js
 Mon Nov 21 21:06:26 2011
@@ -122,12 +122,12 @@ osapi.container.Container.addMixin('Shar
   var lifeCycleHandlers = {};
 
   /**
-   * Respond to the ON_RENDER event by creating a script frame for the
+   * Respond to the ON_BEFORE_RENDER event by creating a script frame for the
    * loading gadget, but only if we need one.
    *
    * @param {!Object} metadata The gadget metadata
    */
-  lifeCycleHandlers[osapi.container.CallbackType.ON_RENDER] = 
function(metadata) {
+  lifeCycleHandlers[osapi.container.CallbackType.ON_BEFORE_RENDER] = 
function(metadata) {
     var url = metadata.url;
     try {
       var feature = metadata.modulePrefs.features['shared-script-frame'];

Modified: 
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js?rev=1204704&r1=1204703&r2=1204704&view=diff
==============================================================================
--- 
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
 (original)
+++ 
shindig/trunk/features/src/test/javascript/features/container/gadget_holder_test.js
 Mon Nov 21 21:06:26 2011
@@ -52,16 +52,18 @@ GadgetHolderTest.prototype.testNew = fun
 GadgetHolderTest.prototype.testRenderWithoutRenderParams = function() {
   var element = {};
   var gadgetInfo = {
-      'iframeUrl' : 'http://shindig/gadgets/ifr?url=gadget.xml'
+      'iframeUrl' : 'http://shindig/gadgets/ifr?url=gadget.xml',
+      'url' : 'gadget.xml'
   };
   this.setupGadgetsRpcSetupReceiver();
-  var holder = new osapi.container.GadgetHolder(123, element);
+  var holder = new osapi.container.GadgetHolder(123, element, 
'__gadgetOnLoad');
   holder.render(gadgetInfo, {}, {});
   this.assertEquals('<iframe' +
       ' marginwidth="0"' +
       ' hspace="0"' +
       ' frameborder="0"' +
       ' scrolling="no"' +
+      ' onload="window.__gadgetOnLoad(\'gadget.xml\');"' +
       ' marginheight="0"' +
       ' vspace="0"' +
       ' id="__gadget_123"' +
@@ -75,7 +77,8 @@ GadgetHolderTest.prototype.testRenderWit
 GadgetHolderTest.prototype.testRenderWithRenderRequests = function() {
   var element = {};
   var gadgetInfo = {
-      'iframeUrl' : 'http://shindig/gadgets/ifr?url=gadget.xml'
+      'iframeUrl' : 'http://shindig/gadgets/ifr?url=gadget.xml',
+      'url' : 'gadget.xml'
   };
   var renderParams = {
       'cajole' : true,
@@ -87,7 +90,7 @@ GadgetHolderTest.prototype.testRenderWit
       'width' : 222
   };
   this.setupGadgetsRpcSetupReceiver();
-  var holder = new osapi.container.GadgetHolder(123, element);
+  var holder = new osapi.container.GadgetHolder(123, element, 
'__gadgetOnLoad');
   holder.render(gadgetInfo, {}, renderParams);
   this.assertEquals('<iframe' +
       ' marginwidth="0"' +
@@ -95,6 +98,7 @@ GadgetHolderTest.prototype.testRenderWit
       ' height="111"' +
       ' frameborder="0"' +
       ' scrolling="no"' +
+      ' onload="window.__gadgetOnLoad(\'gadget.xml\');"' +
       ' class="xyz"' +
       ' marginheight="0"' +
       ' vspace="0"' +


Reply via email to