Anyone have any objections to this?  I would like to get this submitted.

-Ryan

Email: [email protected]
Phone: 978-899-3041
developerWorks Profile



From:   [email protected]
To:     [email protected], [email protected], 
[email protected], 
Cc:     [email protected], [email protected]
Date:   03/04/2011 11:36 AM
Subject:        Allow extensions to the common container by allowing other 
features to provide their own namespace (issue4260049)



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);
+                 }
+}





Reply via email to