/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"

[ptr] native JSContext(JSContext);

[uuid(c67d8270-3189-11d3-9885-006008962422)]
interface nsIJSContextStack : nsISupports
{
    readonly attribute int32_t  count;
    JSContext                   peek();
    JSContext                   pop();
    void                        push(in JSContext cx);
};

[uuid(c7e6b7aa-fc12-4ca7-b140-98c38b698961)]
interface nsIJSContextStackIterator : nsISupports
{
    /**
     * Resets this iterator to the beginning of this thread's stack.
     */
    void reset(in nsIJSContextStack stack);

    /**
     * Returns true if this iterator is at the end of its stack's contexts.
     * @throws NS_ERROR_NOT_INITIALIZED If there has not been a previous call
     *         to reset.
     */
    boolean done();

    /**
     * Returns the prev JSContext off of stack. Note that because we're 
     * iterating over a stack, this value would be the next popped value.
     *
     * @throws NS_ERROR_NOT_INITIALIZED If there has not been a previous call
     *         to reset.
     * @throws NS_ERROR_NOT_AVAILABLE if already at the end.
     */
    JSContext prev();
};

[uuid(59ad3ff1-a2d3-4c11-b825-098bff3c3e15)]
interface nsIThreadJSContextStack : nsIJSContextStack
{
    /* inherits methods of nsIJSContextStack */
    [notxpcom,nostdcall] JSContext getSafeJSContext();
};
