<p>Test for 
<a href="https://bugs.webkit.org/show_bug.cgi?id=27514">Bug 27514 - add support for watched expression</a>.

<p>To begin test, open web inspector, go the scripts panel 
(enabling script debugging if necccessary), and then click this link:
<a href="javascript:runTest()">[begin test]</a>.

<p>Perform the following steps, and note the expected results:
    
<ol>
    
<li><p>After clicking the link above, you should now be paused in the body of 
the test method, thanks to the <code>debugger</code> statement.

<li><p>Add the following expressions to the "Watch Expressions" section of the
Scripts panel sidebar pane: "<code>this</code>", "<code>a</code>", 
"<code>b</code>", "<code>c</code>" and "<code>d</code>". Do <b>NOT</b> enter the quotes.

<li><p>The values of the expressions as shown in the window should a 
<code>DOMWindow</code> for <code>this</code>, <code>undefined</code> for
the <code>a</code>, <code>b</code>, and <code>c</code> variables, and a 
value of <code>ReferenceError: Can't find variable: d</code>
for the <code>d</code> variable.

<li><p>Note that the value for <code>d</code> should not change for the life of 
the test, as the variable <code>d</code> is never introduced in the program.

<li><p>Step through the code, and you'll see the values of <code>a</code>,
<code>b</code>, and <code>c</code> change, as the variables are assigned.
Also note that as the scope changes due to the function invocation, values
will be changed to refer to their current scope.  The <code>this</code>
expression will change when the method is invoked on the object constructed by
the test.

<li><p>Click different stack frames in the Call Stack section to ensure the
expressions change value appropriately as the current stack frame changes.

<li><p>Drive the debugger through the end of the outermost function, so that
the debugger is no longer in paused state.  The values of 
<code>a</code>, <code>b</code>, and <code>c</code> should all be a
ReferenceError like <code>d</code>, since these variables are defined in the
<code>runTest()</code> function, and the expressions are being evaluated against
the global object.

<li><p>From the console, execute the statement "<code>a = 1</code>".  The
watch expressions do not currently refresh, so the value for <code>a</code>
should still be ReferenceError.

<li><p>Click the "Refresh" button in the Watch Expressions section and the
value for "<code>a</code>" should now be "<code>1</code>".

<li><p>Close down the browser, start it back up, traverse to a web site,
bring up web inspector, go to the Scripts panel.  You should see the same
set of Watch Expressions in the list as you had when you last used web
inspector.

<li><p>Delete an expression by moving the mouse into the Watch Expression
section, and clicking the X icon which appears to the right of an 
expression (on hover).

<li><p>Delete an expression by double-clicking anywhere on a top-level line
of a watch expression, and changing the expression to an empty string or 
nothing but white-space.

<li><p>Modify an entry by double-clicking anywhere on a top-level line
of a watch expression, and changing the expression.

<li><p>Enter a new expression, "<code>new Date()</code>".  The value should be
a toString() version of the date.  Repeatedly press the Refresh button to see
the value updated with the current time.

</ol>

<script>
function runTest() {
    
    // a nested function
    function subFunction() {
        debugger;
        var a = "a in subFunction()";
        
        subSubFunction();
        
        // another nested function
        function subSubFunction() {
            debugger;
            var b = "b in subSubFunction()";
        }
    }
    
    // a class
    function aClass() {
        this.x = "xxx";
        this.y = "yyy";
    }
    
    aClass.prototype.aMethod = function() {
        debugger;
        var c = "c in aMethod()";
    }
    
    // main logic
    debugger;
    
    var a = "a in runTest()";
    var b = "b in runTest()";
    var c = "c in runTest()";
    
    subFunction();
    
    var object = new aClass();
    object.aMethod();
    
}
</script>
