/*
 * 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
        CheckDomainSecurity,
#endif
        DelegatingGetOwnPropertySlot,
        DelegatingPutFunction,
        CustomDeleteProperty,
        CustomGetPropertyNames,
        CustomDefineGetter,
        DelegatingPrototypePutFunction,
        CustomPrototypeDefineGetter,
        OmitConstructor
    ] Location {
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
                 attribute [DoNotCheckDomainSecurityOnSet, CustomSetter, V8DisallowShadowing] DOMString href;
#endif

        [Custom, V8OnInstance] void assign(in DOMString url);
        [Custom, V8OnInstance] void replace(in DOMString url);
        [Custom, V8OnInstance] 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

        DOMString getParameter(in DOMString name);

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        [DontEnum, Custom, V8OnInstance, V8ReadOnly, ImplementationFunction=toStringFunction] DOMString toString();
#endif
#if defined(V8_BINDING) && V8_BINDING
        [DontEnum, Custom, V8OnInstance, V8ReadOnly] DOMObject valueOf();
#endif
    };

}
