/*
 * 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
    ] 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
    };

}
