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/03/09 22:10:47 UTC
svn commit: r1079995 - in /shindig/trunk/features/src:
main/javascript/features/container/container.js
test/javascript/features/container/container_test.js
Author: mhermanto
Date: Wed Mar 9 21:10:46 2011
New Revision: 1079995
URL: http://svn.apache.org/viewvc?rev=1079995&view=rev
Log:
Allow extensions to the common container by allowing other features to provide their own namespace.
Much thanks to Ryan Baxter for this. Code reviewed in -- http://codereview.appspot.com/4260049/.
Modified:
shindig/trunk/features/src/main/javascript/features/container/container.js
shindig/trunk/features/src/test/javascript/features/container/container_test.js
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=1079995&r1=1079994&r2=1079995&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/container/container.js (original)
+++ shindig/trunk/features/src/main/javascript/features/container/container.js Wed Mar 9 21:10:46 2011
@@ -114,6 +114,8 @@ shindig.container.Container = function(o
*/
this.tokenRefreshTimer_ = null;
+ this.initializeMixins_();
+
this.preloadFromConfig_(config);
this.registerRpcServices_();
@@ -293,6 +295,17 @@ shindig.container.Container.prototype.rp
shindig.container.Container.prototype.onConstructed = function(opt_config) {};
+/**
+ * Adds a new namespace to the Container object. The namespace
+ * will contain the result of calling the function passed in.
+ * @param {string} namespace
+ * @param {function} func to call when creating the namespace
+ */
+shindig.container.Container.addMixin = function(namespace, func) {
+ shindig.container.Container.prototype.mixins_[namespace] = func;
+};
+
+
// -----------------------------------------------------------------------------
// Valid JSON keys.
// -----------------------------------------------------------------------------
@@ -420,6 +433,27 @@ shindig.container.ContainerRender.WIDTH
// Private variables and methods.
// -----------------------------------------------------------------------------
+
+/**
+ * Adds the ability for features to extend the container with
+ * their own functionality that may be specific to that feature.
+ * @type {Object}
+ * @private
+ */
+shindig.container.Container.prototype.mixins_ = {};
+
+
+/**
+ * Called from the constructor to add any namespace extensions.
+ * @private
+ */
+shindig.container.Container.prototype.initializeMixins_ = function() {
+ for (var i in this.mixins_) {
+ this[i] = new this.mixins_[i](this);
+ }
+};
+
+
/**
* Add list of gadgets to preload list
* @param {Object} response hash of gadgets data
Modified: shindig/trunk/features/src/test/javascript/features/container/container_test.js
URL: http://svn.apache.org/viewvc/shindig/trunk/features/src/test/javascript/features/container/container_test.js?rev=1079995&r1=1079994&r2=1079995&view=diff
==============================================================================
--- shindig/trunk/features/src/test/javascript/features/container/container_test.js (original)
+++ shindig/trunk/features/src/test/javascript/features/container/container_test.js Wed Mar 9 21:10:46 2011
@@ -112,6 +112,38 @@ ContainerTest.prototype.testNewGadgetSit
this.assertTrue(container.sites_[2] != null);
};
+ContainerTest.prototype.testMixinViaPrototype = function() {
+ this.setupGadgetsRpcRegister();
+ shindig.container.Container.prototype.mixins_['test'] = function(context) {
+ return {
+ 'getSitesLength' : function() {
+ return context.sites_.length;
+ }
+ };
+ };
+ var container = new shindig.container.Container();
+ this.setupGadgetSite(1, {}, null);
+ container.newGadgetSite(null);
+ this.assertTrue(container.sites_[1] != null);
+ this.assertEquals(container.sites_.length, container.test.getSitesLength());
+};
+
+ContainerTest.prototype.testMixinViaAdd = function() {
+ this.setupGadgetsRpcRegister();
+ shindig.container.Container.addMixin('test2', function(context) {
+ return {
+ 'getSitesLength' : function() {
+ return context.sites_.length;
+ }
+ };
+ });
+ var container = new shindig.container.Container();
+ this.setupGadgetSite(1, {}, null);
+ container.newGadgetSite(null);
+ this.assertTrue(container.sites_[1] != null);
+ this.assertEquals(container.sites_.length, container.test2.getSitesLength());
+};
+
ContainerTest.prototype.setupGadgetSite = function(id, gadgetInfo, gadgetHolder) {
var self = this;
shindig.container.GadgetSite = function() {