/*
 * 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.
 */

[
#if defined(V8_BINDING) && V8_BINDING
    CheckSecurity,
#endif
    JSCustomGetOwnPropertySlotAndDescriptor,
    CustomNamedSetter,
    JSGenerateIsReachable=ImplFrame,
    CustomDeleteProperty,
    CustomEnumerateProperty,
    JSCustomDefineOwnProperty,
    JSCustomNamedGetterOnPrototype,
    JSCustomDefineOwnPropertyOnPrototype,
    OmitConstructor
] interface Location {
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
             [DoNotCheckSecurityOnSetter, CustomSetter, V8Unforgeable] attribute 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
             [CustomSetter] attribute DOMString protocol;
             [CustomSetter] attribute DOMString host;
             [CustomSetter] attribute DOMString hostname;
             [CustomSetter] attribute DOMString port;
             [CustomSetter] attribute DOMString pathname;
             [CustomSetter] attribute DOMString search;
             [CustomSetter] attribute 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] any valueOf();
#endif
};

