This problem is demonstrated by the "Scoping of JS inline in
HTML" test in specs/scope/spec.js. This test produces:
[java] [PASS](35){scope|Scoping of JS inline in HTML} Can get content from dynamically-generate p element
[java] [PASS](36){scope|Scoping of JS inline in HTML} Got confirmation of access to 'document' object in iframe
[java] [FAIL](37){scope|Scoping of JS inline in HTML} Died on test [#3](/projects/21590/tickets/3 "Ticket #3"): Cannot read property "innerHTML" from null
The bug occurs because there is code in
specs/fixtures/scope/iframeXa.html that defines a function that is
called as the body.onload handler (set as an attribute in the
HTML), but when the onload handler is to be run, the
lookup for the function named in the attribute occurs in a scope
other than the window object within the iframe, so the function
isn't found. (Test runs fine in browser, of course.)
It can be made to run by changing
specs/fixtures/scope/iframeXa.html to be:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- * This file is a component of env.js, *
http://github.com/thatcher/env-js/ * a Pure JavaScript Browser
Environment * Copyright 2010 John Resig, licensed under the MIT
License * http://www.opensource.org/licenses/mit-license.php -->
<!-- elements and scripting here match test cases in
../../scope/spec.js -->
lang="en" dir="ltr" id="html">
<title>Content document for IFRAME element in env.js unit test suite</title>
<p id="anElementWithText">
This is the text content of a paragraph element.
</p>
<script type="text/javascript">
//ensure that we can execute JS inline while loading
document.write(
'\x3cp id="js_generated_p"\x3eDynamically-generated\x3c/p\x3e');
</script>
<script type="text/javascript">
//verify that our "document" object actually points to this page
document.write('\x3cp id="internalDocRefResult"\x3e');
if (document.getElementById('anElementWithText'))
document.write("First paragraph element exists-found.");
else
document.write("Eeek! Didn't find paragraph id=anElementWithText.");
document.write('\x3c/p\x3e');
</script>
<script type="text/javascript">
// append 'p id=appended "An appended paragraph"' to doc....
// function checkEventsWithinIframe(){
top.checkEventsWithinIframe = function(){
top.print("
Hello
Body.OnLoad
");
var t = document.createTextNode("An appended paragraph");
var p = document.createElement("p");
p.setAttribute("id", "appended");
p.appendChild(t);
document.getElementsByTagName('body')[0].appendChild(p);
};
</script>
To verify this diagnosis of the bug, remove the
"top.checkEvents..." line and un-comment the line above it, and the
"Ooops" print in the will be executed when the test is run.