/*
 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

module inspector {

    interface [
        Conditional=JAVASCRIPT_DEBUGGER,
        OmitConstructor,
        DontCheckEnums
    ] JavaScriptCallFrame {

        // Scope type
        const unsigned short GLOBAL_SCOPE = 0;
        const unsigned short LOCAL_SCOPE = 1;
        const unsigned short WITH_SCOPE = 2;
        const unsigned short CLOSURE_SCOPE = 3;
        const unsigned short CATCH_SCOPE = 4;

        [Custom] void evaluate(in DOMString script);

        readonly attribute JavaScriptCallFrame caller;
        readonly attribute long sourceID;
        readonly attribute long line;
        readonly attribute long column;
        readonly attribute [CustomGetter] Array scopeChain;
        [Custom] unsigned short scopeType(in int scopeIndex);
        readonly attribute [CustomGetter] Object thisObject;
        readonly attribute DOMString functionName;
        readonly attribute [CustomGetter] DOMString type;
    };

}
