Revision: 4479
Author:   ihab.awad
Date:     Fri May 20 14:26:06 2011
Log: Implement cajoling and running literal text content (JS or HTML) via
caja.js API.

http://code.google.com/p/google-caja/source/detail?r=4479

Modified:
 /trunk/src/com/google/caja/plugin/caja.js
 /trunk/src/com/google/caja/plugin/load-module.js
 /trunk/tests/com/google/caja/plugin/es53-test-cajajs-invocation.js

=======================================
--- /trunk/src/com/google/caja/plugin/caja.js   Tue May 10 11:53:53 2011
+++ /trunk/src/com/google/caja/plugin/caja.js   Fri May 20 14:26:06 2011
@@ -361,17 +361,29 @@
               });
           }

-          function content(baseUrl, inputContent, contentType) {
+          function content(url, inputContent, mimeType) {
             return runMaker(function (imports, opt_callback) {
-                // XHR post the html through the cajoler to get
-                //   cajoled content.
-                // cajoledRunner(
-                //     baseUrl,
-                //     content.js,
-                //     content.staticHtml)(
-                //     imports,
-                //     opt_callback);
-                throw new Error('Not yet implemented.');
+                tamingWindow.Q.when(
+                    cajolingServiceClient.cajoleContent(
+                        url,
+                        inputContent,
+                        mimeType),
+                    function (moduleJson) {
+                      guestWindow.Q.when(
+                          loader.loadCajoledJson___(url, moduleJson),
+                          function(moduleFunc) {
+                            var result = moduleFunc(imports);
+                            if (opt_callback) {
+                              opt_callback(result);
+                            }
+                          },
+                          function(ex) {
+                            throw new Error(ex);
+                          });
+                    },
+                    function (err) {
+                      throw new Error('Error cajoling content: ' + err);
+                    });
               });
           }

=======================================
--- /trunk/src/com/google/caja/plugin/load-module.js Fri May 6 13:38:34 2011 +++ /trunk/src/com/google/caja/plugin/load-module.js Fri May 20 14:26:06 2011
@@ -88,6 +88,43 @@
       return Q.near(moduleCache.get(fullUrl));
     };

+    var evalAndResolveFromJson = function(url, moduleJson) {
+      var result = Q.defer();
+      var loadForThisModule = makeLoad(url);
+      var moduleObj = evalModuleObjFromJson(moduleJson);
+      Q.when(
+          resolveDependencies(moduleObj, loadForThisModule),
+          function(_) {
+            try {
+              result.resolve(
+                  ___.prepareModule(moduleObj, loadForThisModule));
+            } catch (ex) {
+              result.resolve(Q.reject(ex));
+            }
+          },
+          function(ex) {
+            result.resolve(Q.reject(ex));
+          });
+      return result.promise();
+    };
+
+    var loadCajoledJson___ = function(url, moduleJson) {
+      if (moduleCache.get(url)) {
+        throw new Error('Module already loaded: ' + url);
+      }
+      var moduleDeferred = Q.defer();
+      Q.when(
+          evalAndResolveFromJson(url, moduleJson),
+          function(module) {
+            moduleDeferred.resolve(module);
+          },
+          function(ex) {
+            moduleDeferred.resolve(Q.reject(ex));
+          });
+      moduleCache.set(url, moduleDeferred.promise);
+      return moduleDeferred.promise;
+    };
+
     var async = function(url, contentType) {
       var fullUrl = resolveModuleUrl(baseUrl, url);
       if (moduleCache.get(fullUrl)) {
@@ -97,19 +134,12 @@
       var moduleDeferred = Q.defer();
       var mimeType = contentType || getInputMimeType(url);
       Q.when(
-          cajolingServiceClient.cajoleUrl(fullUrl, mimeType),
-          function(responseJson) {
-            var moduleObj = evalModuleObjFromJson(responseJson);
-            var loadForThisModule = makeLoad(fullUrl);
+          cajolingServiceClient.cajoleUrl(fullUrl, getInputMimeType(url)),
+          function(moduleJson) {
             Q.when(
-                resolveDependencies(moduleObj, loadForThisModule),
-                function(_) {
-                  try {
-                    moduleDeferred.resolve(
-                        ___.prepareModule(moduleObj, loadForThisModule));
-                  } catch (ex) {
-                    moduleDeferred.resolve(Q.reject(ex));
-                  }
+                evalAndResolveFromJson(fullUrl, moduleJson),
+                function(module) {
+                  moduleDeferred.resolve(module);
                 },
                 function(ex) {
                   moduleDeferred.resolve(Q.reject(ex));
@@ -165,6 +195,7 @@
           enumerable: true,
           configurable: false
         });
+    load.loadCajoledJson___ = loadCajoledJson___;
     return ___.markFuncFreeze(load);
   };

=======================================
--- /trunk/tests/com/google/caja/plugin/es53-test-cajajs-invocation.js Thu May 12 13:11:27 2011 +++ /trunk/tests/com/google/caja/plugin/es53-test-cajajs-invocation.js Fri May 20 14:26:06 2011
@@ -85,7 +85,7 @@
       });
     });

-    jsunitRegister('testNoImports', function testNoImports() {
+    registerTest('testNoImports', function testNoImports() {
       fetch('es53-test-guest.out.html', function(resp) {
         var htmlAndScript = splitHtmlAndScript(resp);
         var div = createDiv();
@@ -95,19 +95,44 @@
                .run(undefined, function (result) {
             assertStringContains('static html', div.innerHTML);
             assertStringContains('dynamic html', div.innerHTML);
-            jsunit.pass('testNoImports');
+            jsunitPass('testNoImports');
           });
         });
       });
     });

     // TODO(ihab.awad): Implement 'urlCajoled' case and enable the below.
- // jsunitRegister('testUrlCajoledHtml', function testUrlCajoledHtml() { });
-    // jsunitRegister('testUrlCajoledJs', function testUrlCajoledJs() { });
-
-    // TODO(ihab.awad): Implement 'content' case and enable the below.
-    // jsunitRegister('testContentHtml', function testContentHtml() { });
-    // jsunitRegister('testContentJs', function testContentJs() { });
+ // registerTest('testUrlCajoledHtml', function testUrlCajoledHtml() { });
+    // registerTest('testUrlCajoledJs', function testUrlCajoledJs() { });
+
+    registerTest('testContentHtml', function testContentHtml() {
+      fetch('es53-test-guest.html', function(resp) {
+        var div = createDiv();
+        frameGroup.makeES5Frame(div, uriCallback, function (frame) {
+          frame.content('http://localhost:8080/', resp, 'text/html')
+              .run({}, function (result) {
+            assertStringContains('static html', div.innerHTML);
+            assertStringContains('dynamic html', div.innerHTML);
+            jsunitPass('testContentHtml');
+          });
+        });
+      });
+    });
+
+    registerTest('testContentJs', function testContentJs() {
+      fetch('es53-test-guest.js', function(resp) {
+        frameGroup.makeES5Frame(undefined, uriCallback, function (frame) {
+          var extraImports = { x: 4, y: 3 };
+          frame.content('http://localhost:8080/',
+                        resp,
+                        'application/javascript')
+              .run(extraImports, function (result) {
+            assertEquals(12, result);
+            jsunitPass('testContentJs');
+          });
+        });
+      });
+    });

     registerTest('testUrlHtml', function testUrlHtml() {
       var div = createDiv();

Reply via email to