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

// https://html.spec.whatwg.org/C/#the-location-interface

[
    CheckSecurity=Receiver,
    Exposed=Window
] interface Location {
    [CallWith=Isolate, RaisesException, LegacyUnforgeable] void assign(USVString url);

    // |replace|, and *writing* |href| do not require a security check, as they
    // *change* the page, and thus these do not change any property of an
    // *existing* document at a different origin.
    // However, *reading* |href|, or accessing any component, is a security
    // problem, since that allows tracking navigation.
    // https://html.spec.whatwg.org/C/#crossoriginproperties-(-o-)
    [CallWith=Isolate, CrossOrigin, RaisesException, LegacyUnforgeable] void replace(USVString url);
    [LegacyUnforgeable] void reload();

    // TODO(foolip): |ancestorOrigins| should have [LegacyUnforgeable, SameObject].
    [LegacyUnforgeable] readonly attribute DOMStringList ancestorOrigins;

    [Affects=Nothing, SetterCallWith=Isolate, CrossOrigin=Setter, RaisesException=Setter, LegacyUnforgeable] attribute USVString href;
    // TODO(yukishiino): Use [LegacyUnforgeable] stringifier instead of toString.
    [LegacyUnforgeable] DOMString toString();
    [MeasureAs=LocationOrigin, LegacyUnforgeable] readonly attribute USVString origin;

    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString protocol;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString host;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString hostname;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString port;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString pathname;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString search;
    [SetterCallWith=Isolate, RaisesException=Setter, LegacyUnforgeable] attribute USVString hash;
};
