Reviewers: mhermanto, dev_shindig.apache.org,
dev-remailer_shindig.apache.org,
Description:
At the moment the common container cannot be extended by adding a new
namespace and still have access to the container object. The only
reasonable way to extend the common container at this moment it to add
new methods by calling .prototype or by subclassing it. Another useful
extension would be to allow features to add their own namespace to the
common container and add new methods under that common container.
However those methods may still want to reference other methods inside
the common container so they need to be able to access the common
container object itself.
Please review this at http://codereview.appspot.com/4260049/
Affected files:
features/src/main/javascript/features/container/container.js
features/src/test/javascript/features/container/container_test.js
### Eclipse Workspace Patch 1.0
#P shindig-project
Index: features/src/test/javascript/features/container/container_test.js
===================================================================
--- features/src/test/javascript/features/container/container_test.js
(revision 1078023)
+++ features/src/test/javascript/features/container/container_test.js
(working copy)
@@ -112,6 +112,22 @@
this.assertTrue(container.sites_[2] != null);
};
+ContainerTest.prototype.testMixins_ = 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.setupGadgetSite = function(id, gadgetInfo,
gadgetHolder) {
var self = this;
shindig.container.GadgetSite = function() {
@@ -137,4 +153,4 @@
register: function() {
}
};
-};
+};
\ No newline at end of file
Index: features/src/main/javascript/features/container/container.js
===================================================================
--- features/src/main/javascript/features/container/container.js (revision
1078023)
+++ features/src/main/javascript/features/container/container.js (working
copy)
@@ -113,6 +113,8 @@
* @private
*/
this.tokenRefreshTimer_ = null;
+
+ this.mixin_();
this.preloadFromConfig_(config);
@@ -121,7 +123,6 @@
this.onConstructed(config);
};
-
/**
* Create a new gadget site.
* @param {Element} gadgetEl HTML element into which to render.
@@ -636,3 +637,18 @@
}
});
};
+
+/**
+ * Adds the ability for features to extend the container with
+ * their own functionality that may be specific to that feature.
+ */
+shindig.container.Container.prototype.mixins_ = {};
+
+/**
+ * Called from the constructor to add any namespace extensions.
+ */
+shindig.container.Container.prototype.mixin_ = function(){
+ for(var i in this.mixins_){
+ this[i] = new this.mixins_[i](this);
+ }
+}