<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <
<!-- <
- Copyright (C) 2008 Google Inc. <
- <
- Licensed under the Apache License, Version 2.0 (the "Licen <
- you may not use this file except in compliance with the Li <
- You may obtain a copy of the License at <
- <
- http://www.apache.org/licenses/LICENSE-2.0 <
- <
- Unless required by applicable law or agreed to in writing, <
- distributed under the License is distributed on an "AS IS" <
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expre <
- See the License for the specific language governing permis <
- limitations under the License. <
--> <
<html id="html"><!-- attributes on document should not show i <
<head id="head"> <
<title>Domita</title> <
<
<script src="../console.js" onerror="console.error(this.s <
<script src="../../../../js/json_sans_eval/json_sans_eval <
onerror="console.error(this.src)"></script> <
<script src="../cajita.js" onerror="console.error(this.sr <
<script src="../cajita-promise.js" onerror="console.error <
</script> <
<script src="../cajita-module.js" onerror="console.error( <
</script> <
<script src="../../../../js/jsunit/2.2/jsUnitCore.js"></s <
<script src="jsunit.js" onerror="console.error(this.src)" <
<script src="unicode.js" onerror="console.error(this.src) <
<script src="html4-defs.js" onerror="console.error(this.s <
<script src="css-defs.js" onerror="console.error(this.src <
<script src="html-sanitizer.js" onerror="console.error(th <
<script src="bridal.js" onerror="console.error(this.src)" <
<script src="html-emitter.js" onerror="console.error(this <
<script src="domita.js" onerror="console.error(this.src)" <
<!-- Prime the browser cache by loading the whitelisted s <
- synchronously so the test doesn't take so long. --> <
<script src="whitelisted_script.js" <
onerror="console.error(this.src)"></script> <
<
<script src="../console.js"></script> <
<
<script type="text/javascript"> <
function testDomita() { <
this.evaluateAsyncRequirements(function (pass) { <
if (!pass) { <
document.title = document.title.replace( <
/ - all tests passed$/, ' - async tests failed' <
} <
assertTrue(document.title, <
/(?: - all tests passed)?$/.test(document. <
}); <
} <
<
// globalSideEffect() is not exposed to cajoled code, so <
// can reach it, then it has escaped containment. <
// checkGlobalSideEffect() is exposed to cajoled code and <
// globalSideEffect() has been called since the last call <
// checkGlobalSideEffect(). <
(function () { <
var sideEffectHappened = false; <
function globalSideEffect() { sideEffectHappened = true <
function checkGlobalSideEffect() { <
var result = sideEffectHappened; <
sideEffectHappened = false; <
return result; <
} <
this.globalSideEffect = globalSideEffect; <
this.checkGlobalSideEffect = checkGlobalSideEffect; <
})(); <
<
// Test that side effect catching works by trying it unca <
jsunitRegister( <
'_testSideEffectTestFramework', <
function _testSideEffectTestFramework() { <
assertFalse(checkGlobalSideEffect()); <
var s = document.createElement('SCRIPT'); <
s.innerHTML = 'globalSideEffect()'; <
document.body.appendChild(s); <
assertTrue(checkGlobalSideEffect()); <
assertFalse(checkGlobalSideEffect()); <
jsunit.pass('_testSideEffectTestFramework'); <
}); <
</script> <
</head> <
<
<body bgcolor="white" onload="testDomita()"> <
<
<style type="text/css"> <
a:visited { color: purple; } <
a:link { color: blue; } <
</style> <
<
<!-- Ensure http://www.google.com/favicon.ico is :visited <
<img src="http://www.google.com/favicon.ico"/> <
<
<div id="untrusted_content" class="vdoc-body___ xyz___" <
title="<Untrusted Content Title>" <
style="position: relative; <
width: 600px; <
height: 400px; <
color: rgb(3,6,9); <
/* on IE, width and height aren't limited for ove <
overflow: hidden;"> <
<!-- should appear first --> <
<div id="absolutely-positioned-xyz___" <
style="position: absolute; padding: 0; margin: 0; <
left: 11px; top: 3px; width:100px; height:40px; <
>abs</div <
><div id="relatively-positioned-xyz___" <
style="margin: 0 0 0 9px; padding: 0; border-width: 0 <
width: 100px; height: 40px" <
>rel</div> <
<
<!-- inaccessible to document.getElementById --> <
<div id="foo"></div> <
<
<!-- accessible, but with certain inaccessible attribut <
<!-- The unescaped title attribute and the > after the <
- intentionally non-standard to test the behavior of <
- various browsers. --> <
<div id="test-inner-html-xyz___" class="testcontainer" <
><a id="bar" href="http://foo.com?a=b&c=d" class="link <
title="<click me!>" target="_parent" <
>Test <em id="em-xyz___">Not</em>> run yet.</a> <
</div> <
<
<div class="testcontainer" id="test-opaque-nodes-xyz___ <
><!-- Comment -->a<script id="howdy-script-xyz___">/* <
>b<object></object>c</div> <
<
<!-- http://www.google.com/favicon.ico has been visited <
by the above IMG tag --> <
<a id="direct-visited-xyz___" href="http://www.google.c <
Visited <
</a> <
<a href="http://www.google.com/"> <
<span id="nested-visited-xyz___">Visited</span> <
</a> <
<
<!-- http://www.example.com/ is reserved by RFC2606 --> <
<a id="direct-link-xyz___" href="http://www.example.com <
Link <
</a> <
<a href="http://www.example.com/"> <
<span id="nested-link-xyz___">Link</span> <
</a> <
</div> <
<
<div id="console-results"></div> <
<
<script type="text/javascript"> <
function loadScript(src) { <
document.write( <
'<script src="' + html.escapeAttrib(src) + '"' <
+ ' onerror="console.error(this.src)"><\/script>' <
} <
<
function makeXhr() { function
makeXhr() {
if (typeof XMLHttpRequest === 'undefined') { if (typeof
XMLHttpRequest === 'undefined') {
var activeXClassIds = [ var
activeXClassIds = [
'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MS
'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.X
'MSXML2.XMLHTTP', 'MICROSOFT.XMLHTTP.1.0', 'MIC
'MSXML2.XMLHTTP', 'MICROSOFT.XMLHTTP.1.0', 'MICROSOFT
'MICROSOFT.XMLHTTP'];
'MICROSOFT.XMLHTTP'];
for (var i = 0, n = activeXClassIds.length; i < n; for (var i
= 0, n = activeXClassIds.length; i < n; i++) {
var candidate = activeXClassIds[i]; var
candidate = activeXClassIds[i];
try { try {
return new ActiveXObject(candidate); return
new ActiveXObject(candidate);
} catch (e) {} } catch
(e) {}
} }
} }
return new XMLHttpRequest; return new
XMLHttpRequest;
} }
function inlineHtml(href, container) { function
inlineHtml(href, container) {
var xhr = makeXhr(); var xhr =
makeXhr();
xhr.open('GET', href, false);
xhr.open('GET', href, false);
xhr.send(null);
xhr.send(null);
if (xhr.status !== 200 && xhr.status !== 0) { if
(xhr.status !== 200 && xhr.status !== 0) {
throw new Error('Failed to load ' + href + ' : ' + throw new
Error('Failed to load ' + href + ' : ' + xhr.st
} }
var htmlAndScript = xhr.responseText.match( var
htmlAndScript = xhr.responseText.match(
/^([\s\S]*?)<script[^>]*>([\s\S]*?)<\/script>$/);
/^([\s\S]*?)<script[^>]*>([\s\S]*?)<\/script>$/);
var div = container.ownerDocument.createElement('DIV' var div =
container.ownerDocument.createElement('DIV');
div.innerHTML = htmlAndScript[1]; div.innerHTML
= htmlAndScript[1];
while (div.firstChild) { container.appendChild(div.fi while
(div.firstChild) { container.appendChild(div.firstChi
eval(htmlAndScript[2]);
eval(htmlAndScript[2]);
} }
var isValija = /[&?]valija([=&]|$)/.test(location.searc var isValija =
/[&?]valija([=&]|$)/.test(location.search);
</script> <
<script type="text/javascript"> | var
valijaModuleVow = isValija ?
var valijaMaker; |
scriptModuleLoad.async('valija.co.js') :
(function () { | undefined;
if (isValija) { | var
serverJsSandboxModuleVow = isValija?
var testImports = ___.copy(___.sharedImports); |
scriptModuleLoad.async('serverjs-sandbox.co.js') :
testImports.loader = ___.freeze({ | undefined;
provide: ___.markFuncFreeze(function (v) { vali <
}); <
___.getNewModuleHandler().setImports(testImports); <
loadScript('valija.co.js'); <
} <
})();</script> <
<script type="text/javascript"> | //
globalSideEffect() is not exposed to cajoled code, so if c
var serverJsSandboxMaker; | // can reach
it, then it has escaped containment.
> //
checkGlobalSideEffect() is exposed to cajoled code and ret
> //
globalSideEffect() has been called since the last call to
> //
checkGlobalSideEffect().
(function () { (function () {
if (isValija) { | var
sideEffectHappened = false;
var testImports = ___.copy(___.sharedImports); | function
globalSideEffect() { sideEffectHappened = true; }
testImports.loader = ___.freeze({ | function
checkGlobalSideEffect() {
provide: ___.markFuncFreeze(function (v) | var result
= sideEffectHappened;
{ serverJsSandboxMaker = v; }) |
sideEffectHappened = false;
}); | return
result;
___.getNewModuleHandler().setImports(testImports); <
loadScript('serverjs-sandbox.co.js'); <
} }
})();</script> |
this.globalSideEffect = globalSideEffect;
>
this.checkGlobalSideEffect = checkGlobalSideEffect;
> })();
<script type="text/javascript">(function () { | function
initialize(serverJsSandboxModule, valijaModule) {
___.setLogFunc(function(msg) { console.log(msg); });
___.setLogFunc(function(msg) { console.log(msg); });
var testImports = ___.copy(___.sharedImports); var
testImports = ___.copy(___.sharedImports);
if (valijaMaker) { testImports.outers = testImports; } | if (isValija)
{ testImports.outers = testImports; }
var testDomContainer = document.getElementById('untrust var
testDomContainer = document.getElementById('untrusted_c
var pseudoWindowLocation = { var
pseudoWindowLocation = {
href: 'http://zip.example.com:4242/pumpkin.html?q=g href:
'http://zip.example.com:4242/pumpkin.html?q=getit
hash: '#myanchor', hash:
'#myanchor',
host: 'zip.example.com:4242', host:
'zip.example.com:4242',
hostname: 'zip.example.com', hostname:
'zip.example.com',
pathname: '/pumpkin.html', pathname:
'/pumpkin.html',
port: '4242', port:
'4242',
protocol: 'http:', protocol:
'http:',
search: '?q=getit' search:
'?q=getit'
}; };
>
___.setNewModuleHandler(___.makeNormalNewModuleHandler());
___.getNewModuleHandler().setImports(testImports);
___.getNewModuleHandler().setImports(testImports);
testImports.jsunitRegister = ___.markFuncFreeze(jsunitR
testImports.jsunitRegister = ___.markFuncFreeze(jsunitRegis
testImports.jsunitRun = ___.markFuncFreeze(jsunitRun);
testImports.jsunitRun = ___.markFuncFreeze(jsunitRun);
testImports.console = ___.primFreeze({
testImports.console = ___.primFreeze({
log: ___.markFuncFreeze( log:
___.markFuncFreeze(
function () { console.log.apply(console, argument
function () { console.log.apply(console, arguments);
warn: ___.markFuncFreeze( warn:
___.markFuncFreeze(
function () { console.warn.apply(console, argumen
function () { console.warn.apply(console, arguments);
error: ___.markFuncFreeze( error:
___.markFuncFreeze(
function () { console.error.apply(console, argume
function () { console.error.apply(console, arguments)
trace: ___.markFuncFreeze( trace:
___.markFuncFreeze(
function () {
function () {
console.trace ? console.trace()
console.trace ? console.trace()
: console.error.apply(console, arguments); :
console.error.apply(console, arguments);
}) })
}); });
// Give unfiltered DOM access so we can check the resul // Give
unfiltered DOM access so we can check the results o
testImports.directAccess = ___.primFreeze({
testImports.directAccess = ___.primFreeze({
// Allow testing of emitHtml by exposing it for testi // Allow
testing of emitHtml by exposing it for testing
click: ___.markFuncFreeze(function (tameNode) { click:
___.markFuncFreeze(function (tameNode) {
tameNode.node___.click();
tameNode.node___.click();
}), }),
emitCssHook: ___.markFuncFreeze(function (css) {
emitCssHook: ___.markFuncFreeze(function (css) {
testImports.emitCss___(css.join('xyz___'));
testImports.emitCss___(css.join('xyz___'));
}), }),
getInnerHTML: ___.markFuncFreeze(function (tameNode)
getInnerHTML: ___.markFuncFreeze(function (tameNode) {
return tameNode.node___.innerHTML; return
tameNode.node___.innerHTML;
}), }),
getAttribute: ___.markFuncFreeze(function (tameNode,
getAttribute: ___.markFuncFreeze(function (tameNode, name
return tameNode.node___.getAttribute(name); return
tameNode.node___.getAttribute(name);
}), }),
getBodyNode: ___.markFuncFreeze(function () {
getBodyNode: ___.markFuncFreeze(function () {
return testImports.tameNode___(testDomContainer); return
testImports.tameNode___(testDomContainer);
}), }),
getComputedStyle: ___.markFuncFreeze(function (tameNo
getComputedStyle: ___.markFuncFreeze(function (tameNode,
var node = tameNode.node___; var node
= tameNode.node___;
if (node.currentStyle) { if
(node.currentStyle) {
return node.currentStyle[styleProp.replace( return
node.currentStyle[styleProp.replace(
/-([a-z])/g,
/-([a-z])/g,
function (_, letter) {
function (_, letter) {
return letter.toUpperCase();
return letter.toUpperCase();
})]; })];
} else if (window.getComputedStyle) { } else if
(window.getComputedStyle) {
return window.getComputedStyle(node, null) return
window.getComputedStyle(node, null)
.getPropertyValue(styleProp);
.getPropertyValue(styleProp);
} else { } else {
return null; return
null;
} }
}), }),
// Lets tests check that an outer hull breach -- acce // Lets
tests check that an outer hull breach -- access t
// an unexecuted script node -- does not allow a full // an
unexecuted script node -- does not allow a full bre
makeUnattachedScriptNode: ___.markFuncFreeze(function
makeUnattachedScriptNode: ___.markFuncFreeze(function ()
var s = document.createElement('script'); var s =
document.createElement('script');
s.appendChild(document.createTextNode('/* intention
s.appendChild(document.createTextNode('/* intentionally
return testImports.tameNode___(s, true); return
testImports.tameNode___(s, true);
}), }),
isValija: isValija, isValija:
isValija,
clearModuleCache: clearModuleCache
clearModuleCache: clearModuleCache
}); });
// Marks a container green to indicate that test passed // Marks a
container green to indicate that test passed
testImports.pass = ___.markFuncFreeze(function (id) {
testImports.pass = ___.markFuncFreeze(function (id) {
jsunit.pass(id);
jsunit.pass(id);
var node = testImports.document.getElementById(id); var node =
testImports.document.getElementById(id);
if (!node) return; if (!node)
return;
node = node.node___; node =
node.node___;
node.appendChild(document.createTextNode('Passed ' +
node.appendChild(document.createTextNode('Passed ' + id))
if (node.className) { if
(node.className) {
node.className = node.className.replace(/^clickme-|
node.className = node.className.replace(/^clickme-|^wai
} }
node.className = (node.className || '') + ' passed';
node.className = (node.className || '') + ' passed';
}, 'pass'); }, 'pass');
testImports.checkGlobalSideEffect =
testImports.checkGlobalSideEffect =
___.markFuncFreeze(checkGlobalSideEffect);
___.markFuncFreeze(checkGlobalSideEffect);
// An explicit channel between whitelisted_script.js an // An
explicit channel between whitelisted_script.js and ca
testImports.externalScript = { loaded: false };
testImports.externalScript = { loaded: false };
// TODO: async requirements are not counted in the test // TODO:
async requirements are not counted in the test sta
// Define an asynchronous test mechanism so that we can // Define an
asynchronous test mechanism so that we can tes
// XHR, dynamic script loading, setTimeout, etc. // XHR,
dynamic script loading, setTimeout, etc.
// This allows test code to register conditions that mu // This
allows test code to register conditions that must b
// The conditions can be run periodically until all are // The
conditions can be run periodically until all are sat
// the test times out. // the test
times out.
// If a condition returns true once, it is never evalua // If a
condition returns true once, it is never evaluated
// TODO(mikesamuel): rewrite XHR and setTimeout tests t //
TODO(mikesamuel): rewrite XHR and setTimeout tests to us
(function () { (function () {
var req = []; var req =
[];
var intervalId = null; var
intervalId = null;
var TIMEOUT_MILLIS = 250; var
TIMEOUT_MILLIS = 250;
/** /**
* Registers a requirement for later checking. *
Registers a requirement for later checking.
* @param {string} msg descriptive text used in error * @param
{string} msg descriptive text used in error mes
* @param {function () : boolean} predicate returns t * @param
{function () : boolean} predicate returns true
* the requirement has been satisfied. * the
requirement has been satisfied.
*/ */
testImports.assertAsynchronousRequirement = ___.markF
testImports.assertAsynchronousRequirement = ___.markFuncF
function (msg, predicate) {
function (msg, predicate) {
req.push({ message: String(msg), predicate: pre
req.push({ message: String(msg), predicate: predica
}); });
/** /**
* Start checking the asynchronous requirements. * Start
checking the asynchronous requirements.
* @param {function (boolean) : void} handler called * @param
{function (boolean) : void} handler called with
* {...@code true} when and if all requirements are *
{...@code true} when and if all requirements are sati
* Called with false if more than TIMEOUT_MILLIS *
Called with false if more than TIMEOUT_MILLIS time
* and requirements still aren't satisfied. * and
requirements still aren't satisfied.
*/ */
this.evaluateAsyncRequirements = function (handler) {
this.evaluateAsyncRequirements = function (handler) {
if (intervalId !== null) { throw new Error('dupe ha if
(intervalId !== null) { throw new Error('dupe handle
if (req.length === 0) { if
(req.length === 0) {
handler(true);
handler(true);
} else { } else {
var timeoutTime = (new Date).getTime() + TIMEOUT_ var
timeoutTime = (new Date).getTime() + TIMEOUT_MILL
intervalId = setInterval(function () {
intervalId = setInterval(function () {
for (var i = req.length; --i >= 0;) { for
(var i = req.length; --i >= 0;) {
var msgAndPredicate = req[i]; var
msgAndPredicate = req[i];
try { try
{
if (true === ___.toFunc(msgAndPredicate.pre
if (true === ___.toFunc(msgAndPredicate.predica
// Requirement satisfied.
// Requirement satisfied.
req[i] = req[req.length - 1];
req[i] = req[req.length - 1];
--req.length;
--req.length;
} }
} catch (e) { }
catch (e) {
console.error(
console.error(
'Asynchronous failure : ' + msgAndPredi
'Asynchronous failure : ' + msgAndPredicate
} }
} }
if (req.length === 0 || (new Date).getTime() >= if
(req.length === 0 || (new Date).getTime() >= tim
clearInterval(intervalId);
clearInterval(intervalId);
intervalId = null;
intervalId = null;
var failures = req.length !== 0; var
failures = req.length !== 0;
if (failures) { if
(failures) {
for (var i = req.length; --i >= 0;) {
for (var i = req.length; --i >= 0;) {
console.error('async test timeout: ' + re
console.error('async test timeout: ' + req[i]
} }
req.length = 0;
req.length = 0;
} }
handler(!failures);
handler(!failures);
} }
}, 50); }, 50);
} }
}; };
})(); })();
var jsunitFns = [ var jsunitFns
= [
'assert', 'assertContains', 'assertEquals', 'assert 'assert',
'assertContains', 'assertEquals', 'assertEval
'assertEvaluatesToTrue', 'assertFalse', 'assertHTML
'assertEvaluatesToTrue', 'assertFalse', 'assertHTMLEqua
'assertHashEquals', 'assertNotEquals', 'assertNotNu
'assertHashEquals', 'assertNotEquals', 'assertNotNull',
'assertNotUndefined', 'assertNull', 'assertRoughlyE
'assertNotUndefined', 'assertNull', 'assertRoughlyEqual
'assertTrue', 'assertObjectEquals', 'assertUndefine
'assertTrue', 'assertObjectEquals', 'assertUndefined',
'fail', 'setUp', 'tearDown']; 'fail',
'setUp', 'tearDown'];
for (var i = jsunitFns.length; --i >= 0;) { for (var i =
jsunitFns.length; --i >= 0;) {
var name = jsunitFns[i]; var name =
jsunitFns[i];
if (testImports.hasOwnProperty(name)) { if
(testImports.hasOwnProperty(name)) {
throw new Error('already defined', name); throw new
Error('already defined', name);
} }
testImports[name] = ___.markFuncFreeze(this[name], na
testImports[name] = ___.markFuncFreeze(this[name], name);
} }
testImports.valijaMode = !!valijaMaker; |
testImports.valijaMode = isValija;
testImports.Q = Q; testImports.Q
= Q;
testImports.xhrModuleLoad = ___.primFreeze({
testImports.xhrModuleLoad = ___.primFreeze({
async: ___.markFuncFreeze(function(src) { async:
___.markFuncFreeze(function(src) {
return xhrModuleLoad.async( return
xhrModuleLoad.async(
'/ant-lib/com/google/caja/' + src);
'/ant-lib/com/google/caja/' + src);
}) })
}); });
testImports.scriptModuleLoad = ___.primFreeze({
testImports.scriptModuleLoad = ___.primFreeze({
async: ___.markFuncFreeze(function(src) { async:
___.markFuncFreeze(function(src) {
return scriptModuleLoad.async( return
scriptModuleLoad.async(
'http://localhost:8000/ant-lib/com/google/caja/
'http://localhost:8000/ant-lib/com/google/caja/' +
}) })
}); });
if (isValija) { if (isValija)
{
testImports.xhrIncludeScript = ___.primFreeze({
testImports.xhrIncludeScript = ___.primFreeze({
async: ___.markFuncFreeze(function(src) { async:
___.markFuncFreeze(function(src) {
var m = xhrModuleLoad.async( var m =
xhrModuleLoad.async(
'/ant-lib/com/google/caja/' + src);
'/ant-lib/com/google/caja/' + src);
return Q.when(m, return
Q.when(m,
function(module) { return module({$v: testImp
function(module) { return module({$v: testImports
}) })
}); });
testImports.scriptIncludeScript = ___.primFreeze({
testImports.scriptIncludeScript = ___.primFreeze({
async: ___.markFuncFreeze(function(src) { async:
___.markFuncFreeze(function(src) {
var m = scriptModuleLoad.async( var m =
scriptModuleLoad.async(
'http://localhost:8000/ant-lib/com/google/caj
'http://localhost:8000/ant-lib/com/google/caja/'
return Q.when(m, return
Q.when(m,
function(module) { return module({$v: testImp
function(module) { return module({$v: testImports
}) })
}); });
testImports.env = testImports;
testImports.env = testImports;
testImports.env.x = 6;
testImports.env.x = 6;
var $s = serverJsSandboxMaker.CALL___( | var $s =
serverJsSandboxModule.CALL___({
testImports.env, valijaMaker, testImports.xhr | env:
testImports.env,
>
valijaModule: valijaModule,
> load:
testImports.xhrModuleLoad
> });
testImports.serverJsModuleLoad = $s.loadModule;
testImports.serverJsModuleLoad = $s.loadModule;
} }
attachDocumentStub(
attachDocumentStub(
'-xyz___',
'-xyz___',
{ {
rewrite:
rewrite:
function (uri, mimeType) {
function (uri, mimeType) {
// TODO(mikesamuel): write this properly.
// TODO(mikesamuel): write this properly.
// Whitelisting via regexp is not correct.
// Whitelisting via regexp is not correct.
var m = uri.match(
var m = uri.match(
/^([^?#]*\/)?unproxied_whitelisted_scr
/^([^?#]*\/)?unproxied_whitelisted_script\
if (m) { return (m[1] || '') + 'whiteliste
if (m) { return (m[1] || '') + 'whitelisted_sc
if (/^(?:[^?#]*\/)?xhrTest[^\/?#]*$/.test(
if (/^(?:[^?#]*\/)?xhrTest[^\/?#]*$/.test(uri)
return uri;
return uri;
} }
if (!/^https?:\/\//i.test(uri)) { return n
if (!/^https?:\/\//i.test(uri)) { return null;
return 'http://gadget-proxy/?url=' + encod
return 'http://gadget-proxy/?url=' + encodeURI
+ '&mimeType=' + encodeURIComponent(mi
+ '&mimeType=' + encodeURIComponent(mimeTy
} }
}, },
testImports,
testImports,
testDomContainer,
testDomContainer,
pseudoWindowLocation);
pseudoWindowLocation);
console.log('attached stubs');
console.log('attached stubs');
// Create a readonly mirror of document so that we can // Create a
readonly mirror of document so that we can test
// fail when they should. // fail when
they should.
var documentHolder = valijaMaker ? testImports.outers : | var
documentHolder = isValija ? testImports.outers : testIm
documentHolder.documentRO = new testImports.TameHTMLDoc
documentHolder.documentRO = new testImports.TameHTMLDocumen
document, testDomContainer, false); document,
testDomContainer, false);
testImports.htmlEmitter___ = new HtmlEmitter(
testImports.htmlEmitter___ = new HtmlEmitter(
testDomContainer, testImports.document);
testDomContainer, testImports.document);
if (valijaMaker) { | if (isValija)
{
testImports.$v = valijaMaker.CALL___(testImports.oute |
testImports.$v = valijaModule.CALL___({ outers: testImpor
} }
window.toString = function () { return '[WINDOW]'; };
window.toString = function () { return '[WINDOW]'; };
inlineHtml(isValija ? 'domita_test.vo.html' : 'domita_t
inlineHtml(isValija ? 'domita_test.vo.html' : 'domita_test.
testDomContainer);
testDomContainer);
})(); </script> <
</body> |
this.evaluateAsyncRequirements(function (pass) {
</html> | if (!pass) {
>
document.title = document.title.replace(
> / -
all tests passed$/, ' - async tests failed');
> }
>
assertTrue(document.title,
>
/(?: - all tests passed)?$/.test(document.titl
> });
> }
>
> function
testDomita() {
> if (isValija)
{
>
Q.when(serverJsSandboxModuleVow, function(serverJsSandbox
>
Q.when(valijaModuleVow, function(valijaModule) {
>
initialize(serverJsSandboxModule, valijaModule)
> })
> });
> } else {
>
initialize(undefined, undefined);
> }
> }
>
> // Test that
side effect catching works by trying it uncajole
> jsunitRegister(
>
'_testSideEffectTestFramework',
> function
_testSideEffectTestFramework() {
>
assertFalse(checkGlobalSideEffect());
> var s =
document.createElement('SCRIPT');
>
s.innerHTML = 'globalSideEffect()';
>
document.body.appendChild(s);
>
assertTrue(checkGlobalSideEffect());
>
assertFalse(checkGlobalSideEffect());
>
jsunit.pass('_testSideEffectTestFramework');
> });