
<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 -->
