/*
 * 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 {
                 attribute [DoNotCheckDomainSecurityOnSet, CustomSetter, V8DisallowShadowing] DOMString href;

        [Custom, V8OnInstance] void assign(in DOMString url);
        [Custom, V8OnInstance] void replace(in DOMString url);
        [Custom, V8OnInstance] void reload();

        // URI decomposition attributes
                 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;

#if defined(LANGUAGE_JAVASCRIPT) && LANGUAGE_JAVASCRIPT
        [DontEnum, Custom, V8OnInstance, V8ReadOnly] DOMString toString();
#endif
#if defined(V8_BINDING) && V8_BINDING
        [DontEnum, Custom, V8OnInstance, V8ReadOnly] DOMObject valueOf();
#endif
    };

}
