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"' +