
<p><b>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=30212">Bug 30212</a> - Each JS execution in console adds extra item into "scripts" combo</b>

<p>The following manual test creates functions via <tt>eval()</tt> and the
<tt>Function()</tt> constructor, some functions are named using the
<code>//# sourceURL=</code> directive, some aren't.  Some contain
<tt>debugger</tt> commands, some don't.

<p>The functions named <tt>f_named_X</tt> are 'named' via the
<code>//# sourceURL=</code> directive, the ones named <tt>f_unnamed_X</tt>
are not.  The 'named' functions should show up in the Scripts select element used
to select a resource/script to view, the 'unnamed' ones should not.

<ul>
<li><p>open this page with Web Inspector
<li><p>switch to the Scripts panel, enabling debug if required
<li><p>the available scripts in the select element should be:
<ul>
<li>(program): f_named_1.eval
<li>(program): f_named_2.eval
<li>(program): f_named_3.eval
<li>hidden-evals.html
</ul>
<li><p>click this button: <input id=button type=button value="click me">
<li><p>debugger should stop in the <code>clickHandler</code> function
<li><p>at this point, start stepping <b>into</b> the code
<li><p>you should be able to step into functions <code>f_unnamed_1()</code>
and <code>f_unnamed_2()</code>.  There are no resource/scripts in the
select element that contain these functions, until you actually are paused
in them.  At that point, entries for these functions will be in the select element,
named: "(program)".  After pausing in both functions, there will be two "(program)"
entries.
<li><p>you should be able to use the next/prev buttons (to the left of the select element)
to switch to other resources/scripts that have been opened, including the ones
containing these functions
<li><p>you should be able to click on the functions that exist in the 'hidden'
resources from the Call Stack, and be shown the source; click around the
stack trace entries to verify
<li><p>rather than stepping into the <code>f_named_3()</code> call, press the
resume button
<li><p>the debugger should stop in <code>f_named_3()</code> because of the
<code>debugger</code> command
<li><p>rather than stepping into the <code>f_unnamed_3()</code> call, press the
resume button
<li><p>the debugger should stop in <code>f_unnamed_3()</code> because of the
<code>debugger</code> command.  At this point, a third "(program)" entry for
this function is added to the select element.
</ul>

<script>

function doNothing() { /* allows multi-line functions, easier to debug */ };

eval([
    "function f_named_1() {",
    "   doNothing();",
    "   return 'named_1';",
    "}",
    "//# sourceURL=f_named_1.eval"
].join("\n"));

eval([
    "function f_unnamed_1() {",
    "   doNothing();",
    "   return 'unnamed_1';",
    "}"
].join("\n"));

f_named_2 = Function([
    "",
    "   doNothing();",
    "   return 'named_2';",
    "//# sourceURL=f_named_2.eval"
].join("\n"));

f_unnamed_2 = Function([
    "",
    "   doNothing();",
    "   return 'unnamed_2';"
].join("\n"));

f_named_3 = Function([
    "",
    "   debugger;",
    "   doNothing();",
    "   return 'named_3';",
    "//# sourceURL=f_named_3.eval"
].join("\n"));

f_unnamed_3 = Function([
    "",
    "   debugger;",
    "   doNothing();",
    "   return 'unnamed_3';"
].join("\n"));

var button = document.getElementById("button");

button.addEventListener("click", clickHandler, false);

function clickHandler() {
    debugger;
    f_named_1();
    f_unnamed_1();
    f_named_2();
    f_unnamed_2();

    // press "resume" at this point
    console.log("press resume before calling f_named_3()");
    f_named_3();

    // press "resume" at this point
    console.log("press resume before calling f_unnamed_3()");
    f_unnamed_3();
}

</script>
<!-- End -->
