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();