<!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="utf8">
  <title>Test for the cd() function</title>
  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript;version=1.8" src="common.js"></script>
  <!-- Any copyright is dedicated to the Public Domain.
     - http://creativecommons.org/publicdomain/zero/1.0/ -->
</head>
<body>
<p>Test for the cd() function</p>

<iframe id="content-iframe" src="http://example.com/chrome/devtools/shared/webconsole/test/sandboxed_iframe.html"></iframe>

<script class="testbody" type="text/javascript;version=1.8">
SimpleTest.waitForExplicitFinish();

let gState;

function startTest()
{
  removeEventListener("load", startTest);

  attachConsoleToTab([], onAttach);
}

function onAttach(aState, aResponse)
{
  top.foobarObject = Object.create(null);
  top.foobarObject.bug609872 = "parent";

  window.foobarObject = Object.create(null);
  window.foobarObject.bug609872 = "child";

  gState = aState;

  let tests = [doCheckParent, doCdIframe, doCheckIframe,
      doCdContentIframe,
      doCdSandboxedIframe, doCheckSandboxedIframe,
      doCdParent,
      doCdParent,
      doCheckParent2];
  runTests(tests, testEnd);
}

function doCheckParent()
{
  info("check parent window");
  gState.client.evaluateJS("window.foobarObject.bug609872",
      onFooObjectFromParent);
}

function onFooObjectFromParent(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "window.foobarObject.bug609872",
    result: "parent",
  });

  ok(!aResponse.exception, "no eval exception");
  ok(!aResponse.helperResult, "no helper result");

  nextTest();
}

function doCdIframe()
{
  info("test cd('iframe')");
  gState.client.evaluateJS("cd('iframe')", onCdIframe);
}

function onCdIframe(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "cd('iframe')",
    result: { type: "undefined" },
    helperResult: { type: "cd" },
  });

  ok(!aResponse.exception, "no eval exception");

  nextTest();
}

function doCheckIframe()
{
  info("check foobarObject from the iframe");
  gState.client.evaluateJS("window.foobarObject.bug609872",
                           onFooObjectFromIframe);
}

function onFooObjectFromIframe(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "window.foobarObject.bug609872",
    result: "child",
  });

  ok(!aResponse.exception, "no js eval exception");
  ok(!aResponse.helperResult, "no helper result");

  nextTest();
}

function doCdContentIframe()
{
  info("test cd('#content-iframe')");
  gState.client.evaluateJS("cd('#content-iframe')", onCdContentIframe);
}

function onCdContentIframe(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "cd('#content-iframe')",
    result: { type: "undefined" },
    helperResult: { type: "cd" },
  });

  ok(!aResponse.exception, "no eval exception");

  nextTest();
}
function doCdSandboxedIframe()
{
  // Don't use string to ensure we don't get security exception
  // when passing a content window reference.
  let cmd = "cd(document.getElementById('sandboxed-iframe').contentWindow)";
  info("test " + cmd);
  gState.client.evaluateJS(cmd, onCdSandboxedIframe.bind(null, cmd));
}

function onCdSandboxedIframe(cmd, aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: cmd,
    result: { type: "undefined" },
    helperResult: { type: "cd" },
  });

  ok(!aResponse.exception, "no eval exception");

  nextTest();
}

function doCheckSandboxedIframe()
{
  info("check foobarObject from the sandboxed iframe");
  gState.client.evaluateJS("window.foobarObject.bug1051224",
                           onFooObjectFromSandboxedIframe);
}

function onFooObjectFromSandboxedIframe(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "window.foobarObject.bug1051224",
    result: "sandboxed",
  });

  ok(!aResponse.exception, "no js eval exception");
  ok(!aResponse.helperResult, "no helper result");

  nextTest();
}

function doCdParent()
{
  info("test cd() back to parent");
  gState.client.evaluateJS("cd()", onCdParent);
}

function onCdParent(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "cd()",
    result: { type: "undefined" },
    helperResult: { type: "cd" },
  });

  ok(!aResponse.exception, "no eval exception");

  nextTest();
}

function doCheckParent2()
{
  gState.client.evaluateJS("window.foobarObject.bug609872",
                           onFooObjectFromParent2);
}

function onFooObjectFromParent2(aResponse)
{
  checkObject(aResponse, {
    from: gState.actor,
    input: "window.foobarObject.bug609872",
    result: "parent",
  });

  ok(!aResponse.exception, "no eval exception");
  ok(!aResponse.helperResult, "no helper result");

  nextTest();
}

function testEnd()
{
  closeDebugger(gState, function() {
    gState = null;
    SimpleTest.finish();
  });
}

addEventListener("load", startTest);
</script>
</body>
</html>