Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

Scope of body.onload handler is root window context, even for HTML loaded into iframes

#170

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.

Reported by gleneivey · May 5th, 2010 @ 04:50 PM

State: new
Milestone: none
Assigned to: nobody

Activity

No comments yet.

Please Sign in or create a free account to add a new ticket.

With your very own profile, you can contribute to projects, track your activity, watch tickets, receive and update tickets through your email and much more.