Author: lryan
Date: Fri Aug 21 18:26:53 2009
New Revision: 806667

URL: http://svn.apache.org/viewvc?rev=806667&view=rev
Log:
Patch from Jasvir Nagra to allow features other than opensocial to tame their 
own libraries. SHINDIG-1149

Modified:
    incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
    incubator/shindig/trunk/features/src/main/javascript/features/core/json.js
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
    incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js

Modified: 
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js?rev=806667&r1=806666&r2=806667&view=diff
==============================================================================
--- 
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js 
(original)
+++ 
incubator/shindig/trunk/features/src/main/javascript/features/caja/taming.js 
Fri Aug 21 18:26:53 2009
@@ -21,8 +21,7 @@
  * This file tames the APIs that are exposed to a gadget
  */
 
-___.enableCaja = (function() {
-
+var caja___ = (function() {
     // URI policy: Rewrites all uris in a cajoled gadget
   var uriCallback = {
     rewrite: function rewrite(uri, mimeTypes) {
@@ -50,6 +49,87 @@
       return $v.cf(callback, Array.slice(arguments, 0));
     };
   };
+  var tamingFunctions = [];
+  // Registered a function to be called during taming
+  var register = function(tamer) {
+    tamingFunctions.push(tamer);
+  }
+  var fire = function(globalScope) {
+    for (var tamer in tamingFunctions) {
+      if (tamingFunctions.hasOwnProperty(tamer)) {
+        // This is just tamingFunctions[tamer](globalScope)
+        // but in a way that does not leak a potent "this"
+        // to the taming functions
+        (1, tamingFunctions[tamer])(globalScope);
+      }
+    }
+  }
+  function whitelist(schema, obj) {
+      if (!obj) { return; }  // Occurs for optional features
+      for (var k in schema) {
+        if (schema.hasOwnProperty(k)) {
+          var m = k.match(/^([mcsa])_(\w+)$/);
+          var type = m[1], name = m[2];
+          switch (type) {
+            case 'c':
+              ___.grantRead(obj, name);
+              whitelist(schema[k], obj[name]);
+              break;
+              // grant access to a function that uses "this"
+            case 'm':
+              ___.grantGeneric(obj.prototype, name);
+              break;
+            case 'f':
+              ___.grantRead(obj.prototype, name);
+              break;
+            case 'a': // attenuate function
+              if ('function' === typeof obj[name] && schema[k]) {
+                ___.handleGeneric(obj, name, schema[k](obj[name]));
+              }
+              break;
+              // grant access to a variable or an instance
+              // of a function that does not use "this"
+            case 's':
+              if ('function' === typeof obj[name]) {
+                ___.grantFunc(obj, name);
+              } else {
+                ___.grantRead(obj, name);
+              }
+              break;
+          }
+        }
+      }
+    }
+
+  function enable() {
+    var imports = ___.copy(___.sharedImports);
+    imports.outers = imports;
+    
+    var gadgetRoot = document.getElementById('cajoled-output');
+    gadgetRoot.className = 'g___';
+    document.body.appendChild(gadgetRoot);
+    
+    imports.htmlEmitter___ = new HtmlEmitter(gadgetRoot);
+    attachDocumentStub('-g___', uriCallback, imports, gadgetRoot);
+    
+    imports.$v = valijaMaker.CALL___(imports.outers);
+    
+    ___.getNewModuleHandler().setImports(imports);
+    
+    fire(imports);
+  }
+  return {
+    enable: enable,
+    register: register,
+    whitelist: whitelist
+  };
+})();
+
+// Tame opensocial
+// TODO(jasvir): Break this into smaller pieces and move to relavent
+// features such the taming is only included if the feature is.
+// TODO(jasvir): Express taming callbacks more succinctly
+caja___.register(function(imports) {
   
   // Warning: multiple taming styles ahead...
   var taming = {
@@ -98,31 +178,31 @@
     newDataRequest: function($v, orig) {
       return function tamedNewDataRequest() {
         var dr = {
-          super_: orig(),
+          super___: orig(),
 
           add: ___.frozenFunc(
               function(thing, str) {
-                return this.super_.add(thing, str);
+                return this.super___.add(thing, str);
               }),
           newFetchPersonAppDataRequest: ___.frozenFunc(
               function(person, what) {
-                return this.super_.newFetchPersonAppDataRequest(person, what);
+                return this.super___.newFetchPersonAppDataRequest(person, 
what);
               }),
           newFetchPersonRequest: ___.frozenFunc(
               function(person, opts) {
-                return this.super_.newFetchPersonRequest(person, opts);
+                return this.super___.newFetchPersonRequest(person, opts);
               }),
           newFetchPeopleRequest: ___.frozenFunc(
               function(person, opts) {
-                return this.super_.newFetchPeopleRequest(person, opts);
+                return this.super___.newFetchPeopleRequest(person, opts);
               }),
           newUpdatePersonAppDataRequest: ___.frozenFunc(
               function(person, opts) {
-                return this.super_.newUpdatePersonAppDataRequest(person, opts);
+                return this.super___.newUpdatePersonAppDataRequest(person, 
opts);
               }),
           send: ___.frozenFunc(
               function(callback) {
-                return this.super_.send(tameCallback($v, callback));
+                return this.super___.send(tameCallback($v, callback));
               })
         };
         return dr;
@@ -140,15 +220,15 @@
           opt_params.contentContainer = opt_params.contentContainer ?
           undefined : ___.guard(blah) && opt_params.contentContainer.node___;
         }
-        this.ts_.addTab(html_sanitize(tabName), opt_params);
+        this.ts___.addTab(html_sanitize(tabName), opt_params);
       };
       
       tamedTabSet.prototype.alignTabs = function(align, opt_offset) {
-        this.ts_.alignTabs(String(align), Number(opt_offset));
+        this.ts___.alignTabs(String(align), Number(opt_offset));
       };
       
       tamedTabSet.prototype.displayTabs = function(display) {
-        this.ts_.displayTabs(Boolean(display));
+        this.ts___.displayTabs(Boolean(display));
       };
       
       return tamedTabSet;
@@ -166,7 +246,7 @@
       // note, we are going to monkey-patch just this function instead of 
wrapping the whole of views...
       getCurrentView: function(orig) {
         return function tamedGetCurrentView() {
-          // Note, taming decision was s_, so maybe we don't need this?
+          // Note, taming decision was s___, so maybe we don't need this?
           var view = orig.call(this);
           ___.grantGeneric(view, 'getName');
           ___.grantGeneric(view, 'isOnlyVisibleGadget');
@@ -175,44 +255,6 @@
       }
     }
   };
-  
-  return function() {
-    var imports = ___.copy(___.sharedImports);
-    imports.outers = imports;
-    
-    var gadgetRoot = document.getElementById('cajoled-output');
-    gadgetRoot.className = 'g___';
-    document.body.appendChild(gadgetRoot);
-    
-    imports.htmlEmitter___ = new HtmlEmitter(gadgetRoot);
-    attachDocumentStub('-g___', uriCallback, imports, gadgetRoot);
-    
-    imports.$v = valijaMaker.CALL___(imports.outers);
-    
-    ___.getNewModuleHandler().setImports(imports);
-    
-    // Taming
-    if (gadgets.flash)
-      gadgets.flash.embedFlash
-          = taming.flash.embedFlash(gadgets.flash.embedFlash);
-    gadgets.util.registerOnLoadHandler
-      = taming.util.registerOnLoadHandler(imports.$v,
-                                          gadgets.util.registerOnLoadHandler);
-    if (gadgets.views)
-      gadgets.views.getCurrentView
-          = taming.views.getCurrentView(gadgets.views.getCurrentView);
-    
-    if (opensocial)
-      opensocial.newDataRequest = taming.newDataRequest(imports.$v,
-                                                        
opensocial.newDataRequest);
-      if (gadgets.MiniMessage)
-        gadgets.MiniMessage = taming.MiniMessage(imports.$v);
-      if (gadgets.TabSet)
-        gadgets.TabSet = taming.TabSet(imports.$v, gadgets.TabSet);
-      
-      // Add the opensocial APIs and mark them callable and readable.
-      imports.outers.gadgets = gadgets;
-      imports.outers.opensocial = opensocial;
       
       // The below described the opensocial reference APIs.
       // A prefix of "c_" specifies a class, "m_" a method, "f_" a field,
@@ -720,46 +762,25 @@
         }
       };
       
-      function whitelist(schema, obj) {
-        if (!obj) { return; }  // Occurs for optional features
-        for (var k in schema) {
-          if (schema.hasOwnProperty(k)) {
-            var m = k.match(/^([mcsa])_(\w+)$/);
-            var type = m[1], name = m[2];
-            switch (type) {
-              case 'c':
-                ___.grantRead(obj, name);
-                whitelist(schema[k], obj[name]);
-                break;
-                // grant access to a function that uses "this"
-              case 'm':
-                ___.grantGeneric(obj.prototype, name);
-                break;
-              case 'f':
-                ___.grantRead(obj.prototype, name);
-                break;
-              case 'a': // attenuate function
-                if ('function' === typeof obj[name] && schema[k]) {
-                  ___.handleGeneric(obj, name, schema[k](obj[name]));
-                }
-                break;
-                // grant access to a variable or an instance
-                // of a function that does not use "this"
-              case 's':
-                if ('function' === typeof obj[name]) {
-                  ___.grantFunc(obj, name);
-                } else {
-                  ___.grantRead(obj, name);
-                }
-                break;
-            }
-          }
-        }
-      }
-      whitelist(opensocialSchema, imports.outers);
+      if (window.gadgets) 
+        imports.outers.gadgets = gadgets;
+      if (window.opensocial)
+        imports.outers.opensocial = opensocial; 
+      caja___.whitelist(opensocialSchema, imports.outers);
       if (gadgets.MiniMessage)
         ___.ctor(gadgets.MiniMessage, Object, 'MiniMessage');
       if (gadgets.TabSet)
         ___.ctor(gadgets.TabSet, Object, 'TabSet');
-  };
-})();
+});
+
+// Expose alert and console.log to cajoled programs
+caja___.register(function(imports) {
+  imports.outers.alert = function(msg) { alert(msg); };
+  ___.grantFunc(imports.outers, 'alert');
+
+  if (console && console.log) {
+    imports.outers.console = console;
+    ___.grantRead(imports.outers, 'console');
+    ___.grantFunc(imports.outers.console, 'log');
+  }
+});

Modified: 
incubator/shindig/trunk/features/src/main/javascript/features/core/json.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/core/json.js?rev=806667&r1=806666&r2=806667&view=diff
==============================================================================
--- incubator/shindig/trunk/features/src/main/javascript/features/core/json.js 
(original)
+++ incubator/shindig/trunk/features/src/main/javascript/features/core/json.js 
Fri Aug 21 18:26:53 2009
@@ -144,6 +144,8 @@
         }
         // Otherwise, iterate through all of the keys in the object.
         for (k in value) {
+          if (k.match('___$'))
+            continue;
           if (value.hasOwnProperty(k)) {
             if (typeof k === 'string') {
               v = stringify(value[k]);

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=806667&r1=806666&r2=806667&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 Fri Aug 21 18:26:53 2009
@@ -80,8 +80,16 @@
           }
         }
 
-        public URI rewrite(ExternalReference externalReference, String string) 
{
-          return retrievedUri.resolve(externalReference.getUri());
+        public URI rewrite(ExternalReference externalReference, String 
mimeType) {
+          URI uri = externalReference.getUri();
+          if (uri.getScheme().equalsIgnoreCase("https")) {
+            return retrievedUri.resolve(uri);
+          } else if ("javascript".equalsIgnoreCase(uri.getScheme())) {
+              // Commonly used javascript url for links with onclick handlers
+              return uri.toString().equals("javascript:void(0)") ? uri : null;
+          } else {
+            return null;
+          }
         }
       };
 
@@ -170,7 +178,7 @@
   private Element tameCajaClientApi(Document doc) {
     Element scriptElement = doc.createElement("script");
     scriptElement.setAttribute("type", "text/javascript");
-    scriptElement.appendChild(doc.createTextNode("___.enableCaja()"));
+    scriptElement.appendChild(doc.createTextNode("caja___.enable()"));
     return scriptElement;
   }
 

Modified: incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js?rev=806667&r1=806666&r2=806667&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js 
(original)
+++ incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js Fri 
Aug 21 18:26:53 2009
@@ -99,7 +99,7 @@
     var params = '';
 
     if (useCaja) {
-      params += "&caja=1";
+      params += "&caja=1&libs=caja";
     }
     if (useDebug) {
       params += "&debug=1";


Reply via email to