/*
 * 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. 
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "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 OR ITS 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 window {

    interface [
#if defined(V8_BINDING) && V8_BINDING
        CheckSecurity,
#endif
        JSCustomGetOwnPropertySlotAndDescriptor,
        CustomNamedSetter,
        JSGenerateIsReachable=ImplFrame,
        CustomDeleteProperty,
        CustomEnumerateProperty,
        JSCustomDefineOwnProperty,
        JSCustomNamedGetterOnPrototype,
        JSCustomDefineOwnPropertyOnPrototype,
        OmitConstructor,
        V8CustomToJSObject
    ] Location {
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
                 attribute [DoNotCheckSecurityOnSetter, CustomSetter, V8Unforgeable] DOMString href;
#endif

        [Custom, V8Unforgeable] void assign(in [Optional=DefaultIsUndefined] DOMString url);
        [Custom, V8Unforgeable] void replace(in [Optional=DefaultIsUndefined] DOMString url);
        [Custom, V8Unforgeable] void reload();

        // URI decomposition attributes
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
                 attribute [CustomSetter] DOMString protocol;
                 attribute [CustomSetter] DOMString host;
                 attribute [CustomSetter] DOMString hostname;
                 attribute [CustomSetter] DOMString port;
                 attribute [CustomSetter] DOMString pathname;
                 attribute [CustomSetter] DOMString search;
                 attribute [CustomSetter] DOMString hash;

                 readonly attribute DOMString origin;
#endif

        readonly attribute DOMStringList ancestorOrigins;

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        [NotEnumerable, Custom, V8Unforgeable, V8ReadOnly, ImplementedAs=toStringFunction] DOMString toString();
#endif
#if defined(V8_BINDING) && V8_BINDING
        [NotEnumerable, Custom, V8Unforgeable, V8ReadOnly] DOMObject valueOf();
#endif
    };

}
