/*
 * Copyright (C) 2006-2016 Apple Inc. All rights reserved.
 * Copyright (C) 2011 Google 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.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR
 * 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.
 */

[
    CheckSecurity,
    CustomDeleteProperty,
    CustomEnumerateProperty,
    CustomGetOwnPropertySlot,
    CustomGetPrototype,
    CustomPreventExtensions,
    CustomProxyToJSObject,
    CustomPutFunction,
    CustomToStringName,
    ExportMacro=WEBCORE_EXPORT,
    ImplicitThis,
    InterfaceName=Window,
    IsImmutablePrototypeExoticObject,
    IsImmutablePrototypeExoticObjectOnPrototype,
    JSCustomDefineOwnProperty,
    JSCustomMarkFunction,
    JSCustomToNativeObject,
    JSLegacyParent=JSDOMWindowBase,
    LegacyUnenumerableNamedProperties,
    PrimaryGlobal,
] interface DOMWindow : EventTarget {
    [Replaceable] readonly attribute Screen screen;
    readonly attribute History history;
    [Replaceable] readonly attribute BarProp locationbar;
    [Replaceable] readonly attribute BarProp menubar;
    [Replaceable] readonly attribute BarProp personalbar;
    [Replaceable] readonly attribute BarProp scrollbars;
    [Replaceable] readonly attribute BarProp statusbar;
    [Replaceable] readonly attribute BarProp toolbar;
    readonly attribute Navigator navigator;
    [Replaceable] readonly attribute Navigator clientInformation;
    [DoNotCheckSecurity, CustomSetter, Unforgeable] attribute Location location;
    [Replaceable, CustomGetter] readonly attribute Event event;

    DOMSelection getSelection();

    [CheckSecurityForNode] readonly attribute Element frameElement;

    [DoNotCheckSecurity, CallWith=CallerWindow, ForwardDeclareInHeader] void focus();
    [DoNotCheckSecurity, ForwardDeclareInHeader] void blur();
    [DoNotCheckSecurity, CallWith=CallerDocument, ForwardDeclareInHeader] void close();

    void print();
    void stop();

    [Custom] DOMWindow open(optional USVString url = "about:blank", optional DOMString target = "_blank", [TreatNullAs=EmptyString] optional DOMString features = "");

    [Custom] any showModalDialog(DOMString url, optional any dialogArgs, optional DOMString featureArgs);

    void alert();
    void alert(DOMString message);
    boolean confirm(optional DOMString message = "");
    DOMString? prompt(optional DOMString message = "", optional DOMString defaultValue = "");

    // FIXME: Using "undefined" as default parameter value is wrong.
    boolean find(optional DOMString string = "undefined", optional boolean caseSensitive = false, optional boolean backwards = false, optional boolean wrap = false, optional boolean wholeWord = false, optional boolean searchInFrames = false, optional boolean showDialog = false);

    [Replaceable] readonly attribute  boolean offscreenBuffering;

    [Replaceable] readonly attribute long outerHeight;
    [Replaceable] readonly attribute long outerWidth;
    [Replaceable] readonly attribute long innerHeight;
    [Replaceable] readonly attribute long innerWidth;
    [Replaceable] readonly attribute long screenX;
    [Replaceable] readonly attribute long screenY;
    [Replaceable] readonly attribute long screenLeft;
    [Replaceable] readonly attribute long screenTop;

    [Replaceable] readonly attribute double scrollX;
    [Replaceable] readonly attribute double scrollY;
    [Replaceable, ImplementedAs=scrollX] readonly attribute double pageXOffset;
    [Replaceable, ImplementedAs=scrollY] readonly attribute double pageYOffset;

    void scrollBy(unrestricted double x, unrestricted double y);
    void scrollTo(unrestricted double x, unrestricted double y);
    [ImplementedAs=scrollTo] void scroll(unrestricted double x, unrestricted double y);

    void scrollBy(optional ScrollToOptions option);
    void scrollTo(optional ScrollToOptions options);
    [ImplementedAs=scrollTo] void scroll(optional ScrollToOptions options);

    void moveBy(optional unrestricted float x = NaN, optional unrestricted float y = NaN); // FIXME: This should take longs, not floats.
    void moveTo(optional unrestricted float x = NaN, optional unrestricted float y = NaN); // FIXME: This should take longs, not floats.
    void resizeBy(optional unrestricted float x = NaN, optional unrestricted float y = NaN); // FIXME: This should take longs, not floats.
    void resizeTo(optional unrestricted float width = NaN, optional unrestricted float height = NaN); // FIXME: This should take longs, not floats.

    [DoNotCheckSecurity, ForwardDeclareInHeader] readonly attribute boolean closed;

    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute unsigned long length;

    attribute DOMString name;

    attribute DOMString status;
    attribute DOMString defaultStatus;
    [ImplementedAs=defaultStatus] attribute DOMString defaultstatus; // For compatibility with legacy content.

    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute DOMWindow self;
    [DoNotCheckSecurity, Unforgeable] readonly attribute DOMWindow window;
    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute  DOMWindow frames;

    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute DOMWindow opener;
    [Replaceable, DoNotCheckSecurityOnGetter] readonly attribute DOMWindow parent;
    [DoNotCheckSecurityOnGetter, Unforgeable] readonly attribute DOMWindow top;

    [Unforgeable] readonly attribute Document document;

    MediaQueryList matchMedia(DOMString query);

    readonly attribute StyleMedia styleMedia; // Keeping for now, but styleMedia has been removed from the CSSOM View specification.

    [NewObject] CSSStyleDeclaration getComputedStyle(Element element, optional DOMString? pseudoElement = null);

    CSSRuleList getMatchedCSSRules(optional Element? element = null, optional DOMString? pseudoElement = null);

    [Replaceable] readonly attribute unrestricted double devicePixelRatio;
    
    WebKitPoint webkitConvertPointFromPageToNode(optional Node? node = null, optional WebKitPoint? p = null);
    WebKitPoint webkitConvertPointFromNodeToPage(optional Node? node = null, optional WebKitPoint? p = null);

    readonly attribute DOMApplicationCache applicationCache;

    [GetterMayThrowException] readonly attribute Storage sessionStorage;
    [GetterMayThrowException] readonly attribute Storage localStorage;

    // This is the interface orientation in degrees. Some examples:
    // 0 when straight up; -90 when rotated 90 degrees clockwise; 90 counter clockwise.
    [Conditional=ORIENTATION_EVENTS] readonly attribute long orientation;

    [CallWith=ScriptState&CallerWindow, DoNotCheckSecurity, ForwardDeclareInHeader, MayThrowException] void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);

    long requestAnimationFrame(RequestAnimationFrameCallback callback);
    void cancelAnimationFrame(long id);
    long webkitRequestAnimationFrame(RequestAnimationFrameCallback callback);
    [ImplementedAs=cancelAnimationFrame] void webkitCancelAnimationFrame(long id);
    [ImplementedAs=cancelAnimationFrame] void webkitCancelRequestAnimationFrame(long id); // This is a deprecated alias for webkitCancelAnimationFrame(). Remove this when removing vendor prefix.

    void captureEvents(); // Not implemented. Also not in modern standards. Empty function may help compatibility with legacy content.
    void releaseEvents(); // Not implemented. Also not in modern standards. Empty function may help compatibility with legacy content.

    attribute XMLDocumentConstructor SVGDocument;

    attribute DOMURLConstructor webkitURL; // FIXME: Deprecate this.
    attribute MutationObserverConstructor WebKitMutationObserver; // FIXME: Remove once we prove it is not needed for compatibility with legacy content.

    [EnabledAtRuntime=CustomElements, ImplementedAs=ensureCustomElementRegistry] readonly attribute CustomElementRegistry customElements;

    [MayThrowException, EnabledForWorld=shadowRootIsAlwaysOpen]
    NodeList collectMatchingElementsInFlatTree(Node scope, DOMString selectors);
    [MayThrowException, EnabledForWorld=shadowRootIsAlwaysOpen]
    Element? matchingElementInFlatTree(Node scope, DOMString selectors);

    // Event handlers unique to Element and DOMWindow.
    // FIXME: Should these be exposed on Document as well (and therefore moved to GlobalEventHandlers.idl)?
    [NotEnumerable] attribute EventHandler onanimationend;
    [NotEnumerable] attribute EventHandler onanimationiteration;
    [NotEnumerable] attribute EventHandler onanimationstart;
    [NotEnumerable] attribute EventHandler ontransitionend;
    [NotEnumerable, ImplementedAs=onwebkitAnimationEnd] attribute EventHandler onwebkitanimationend;
    [NotEnumerable, ImplementedAs=onwebkitAnimationIteration] attribute EventHandler onwebkitanimationiteration;
    [NotEnumerable, ImplementedAs=onwebkitAnimationStart] attribute EventHandler onwebkitanimationstart;
    [NotEnumerable, ImplementedAs=onwebkitTransitionEnd] attribute EventHandler onwebkittransitionend;
    [NotEnumerable, Conditional=IOS_GESTURE_EVENTS] attribute EventHandler ongesturechange;
    [NotEnumerable, Conditional=IOS_GESTURE_EVENTS] attribute EventHandler ongestureend;
    [NotEnumerable, Conditional=IOS_GESTURE_EVENTS] attribute EventHandler ongesturestart;

    // Event handlers unique to DOMWindow.
    [NotEnumerable, Conditional=DEVICE_ORIENTATION] attribute EventHandler ondevicemotion;
    [NotEnumerable, Conditional=DEVICE_ORIENTATION] attribute EventHandler ondeviceorientation;
    [NotEnumerable, Conditional=PROXIMITY_EVENTS] attribute EventHandler onwebkitdeviceproximity;
};

DOMWindow implements GlobalCrypto;
DOMWindow implements GlobalEventHandlers;
DOMWindow implements GlobalPerformance;
DOMWindow implements WindowEventHandlers;
DOMWindow implements WindowOrWorkerGlobalScope;
