/*
 * Copyright (C) 2006, 2007, 2008, 2009 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 COMPUTER, 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 COMPUTER, 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.
 */

// https://html.spec.whatwg.org/#the-window-object

// FIXME: explain all uses of [CrossOrigin]
[
    CheckSecurity=Receiver,
    ImplementedAs=DOMWindow,
    Global=Window,
    Exposed=Window
] interface Window : EventTarget {
    // the current browsing context
    // FIXME: The spec uses the WindowProxy type for this and many other attributes.
    [Affects=Nothing, Unforgeable, CrossOrigin] readonly attribute Window window;
    [Replaceable, CrossOrigin] readonly attribute Window self;
    [Affects=Nothing, Unforgeable, CachedAccessor] readonly attribute Document document;
    attribute DOMString name;
    [Affects=Nothing, PutForwards=href, Unforgeable, CrossOrigin=(Getter,Setter), Custom=Getter] readonly attribute Location location;
    [CallWith=ScriptState] readonly attribute CustomElementRegistry customElements;
    [Affects=Nothing] readonly attribute History history;
    [Replaceable, MeasureAs=BarPropLocationbar] readonly attribute BarProp locationbar;
    [Replaceable, MeasureAs=BarPropMenubar] readonly attribute BarProp menubar;
    [Replaceable, MeasureAs=BarPropPersonalbar] readonly attribute BarProp personalbar;
    [Replaceable, MeasureAs=BarPropScrollbars] readonly attribute BarProp scrollbars;
    [Replaceable, MeasureAs=BarPropStatusbar] readonly attribute BarProp statusbar;
    [Replaceable, MeasureAs=BarPropToolbar] readonly attribute BarProp toolbar;
    attribute DOMString status;
    // https://html.spec.whatwg.org/multipage/window-object.html#dom-window-close
    // TODO(yukishiino): Replace |CurrentWindow| with the incumbent window or
    // something once the incumbent realm is implemented.  Currently,
    // OriginSafeMethodGetter + CurrentWindow are used instead of the incumbent
    // one.
    [CrossOrigin, CallWith=CurrentWindow] void close();
    [CrossOrigin] readonly attribute boolean closed;
    void stop();
    // https://html.spec.whatwg.org/multipage/interaction.html#dom-window-focus
    // https://html.spec.whatwg.org/multipage/interaction.html#focusing-steps
    // TODO(yukishiino): Remove [CallWith=CurrentWindow] or clarify why
    // we need it.  focus() is not supposed to use the incumbent realm.
    // So, we shouldn't need to use CurrentWindow here, however, somehow
    // DOMWindow::focus() is checking if the incumbent window is eligible to
    // focus another window.
    [CrossOrigin, CallWith=CurrentWindow] void focus();
    [CrossOrigin] void blur();

    // other browsing contexts
    [Replaceable, CrossOrigin] readonly attribute Window frames;
    [Replaceable, CrossOrigin] readonly attribute unsigned long length;
    [Unforgeable, CrossOrigin] readonly attribute Window? top;
    // FIXME: opener should be of type any.
    [CrossOrigin, Custom=Setter] attribute Window opener;
    [Replaceable, CrossOrigin] readonly attribute Window? parent;
    [CheckSecurity=ReturnValue, Custom=Getter] readonly attribute Element? frameElement;
    [CallWith=(ExecutionContext,CurrentWindow,EnteredWindow), RaisesException] Window? open(optional URLString url="", optional DOMString target = "_blank", optional [TreatNullAs=EmptyString] DOMString features = "");

    // indexed properties
    // https://html.spec.whatwg.org/C/browsers.html#windowproxy-getownproperty
    [NotEnumerable, CrossOrigin] getter Window (unsigned long index);

    // named properties
    [Custom, NotEnumerable, CrossOrigin] getter object (DOMString name);

    // the user agent
    [Affects=Nothing, LogActivity=GetterOnly] readonly attribute Navigator navigator;
    [LogActivity=GetterOnly, SecureContext=RestrictAppCacheToSecureContexts] readonly attribute ApplicationCache applicationCache;

    // user prompts
    [Measure, CallWith=ScriptState] void alert();
    [Measure, CallWith=ScriptState] void alert(DOMString message);
    [Measure, CallWith=ScriptState] boolean confirm(optional DOMString message = "");
    [Measure, CallWith=ScriptState] DOMString? prompt(optional DOMString message = "", optional DOMString defaultValue = "");
    [Measure, CallWith=ScriptState] void print();

    [CrossOrigin, CallWith=CurrentWindow, RaisesException] void postMessage(any message, USVString targetOrigin, optional sequence<object> transfer = []);

    [CrossOrigin, CallWith=CurrentWindow, RaisesException] void postMessage(any message, optional WindowPostMessageOptions options);

    // WindowOrWorkerGlobalScope mixin
    // https://html.spec.whatwg.org/#windoworworkerglobalscope-mixin
    [Replaceable] readonly attribute DOMString origin;
    void queueMicrotask(VoidFunction callback);

    // AnimationFrameProvider mixin
    // https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames
    [MeasureAs=UnprefixedRequestAnimationFrame] long requestAnimationFrame(FrameRequestCallback callback);
    void cancelAnimationFrame(long handle);

    // HTML obsolete features
    // https://html.spec.whatwg.org/#Window-partial
    [MeasureAs=WindowCaptureEvents] void captureEvents();
    [MeasureAs=WindowReleaseEvents] void releaseEvents();

    [Replaceable, SameObject] readonly attribute External external;

    // Cooperative Scheduling of Background Tasks
    // https://www.w3.org/TR/requestidlecallback/#window_extensions
    [Measure] long requestIdleCallback(IdleRequestCallback callback, optional IdleRequestOptions options);
    void cancelIdleCallback(long handle);

    // CSS Object Model (CSSOM)
    // https://drafts.csswg.org/cssom/#extensions-to-the-window-interface
    [Affects=Nothing, NewObject] CSSStyleDeclaration getComputedStyle(Element elt, optional DOMString? pseudoElt);

    // CSSOM View Module
    // https://drafts.csswg.org/cssom-view/#extensions-to-the-window-interface
    [NewObject] MediaQueryList matchMedia(DOMString query);
    [SameObject, Replaceable] readonly attribute Screen screen;

    [RuntimeEnabled=WorkerTaskQueue, SameObject, Replaceable] readonly attribute ScriptedTaskQueueController TaskQueue;

    // browsing context
    void moveTo(long x, long y);
    void moveBy(long x, long y);
    void resizeTo(long x, long y);
    void resizeBy(long x, long y);

    // viewport
    [Affects=Nothing, Replaceable] readonly attribute long innerWidth;
    [Affects=Nothing, Replaceable] readonly attribute long innerHeight;

    // viewport scrolling
    [Replaceable] readonly attribute double scrollX;
    [Replaceable] readonly attribute double pageXOffset;
    [Replaceable] readonly attribute double scrollY;
    [Replaceable] readonly attribute double pageYOffset;
    void scroll(optional ScrollToOptions options);
    void scroll(unrestricted double x, unrestricted double y);
    void scrollTo(optional ScrollToOptions options);
    void scrollTo(unrestricted double x, unrestricted double y);
    void scrollBy(optional ScrollToOptions options);
    void scrollBy(unrestricted double x, unrestricted double y);

    // Visual Viewport API
    // https://github.com/WICG/ViewportAPI
    [Replaceable, SameObject] readonly attribute VisualViewport visualViewport;

    // client
    [Affects=Nothing, Replaceable] readonly attribute long screenX;
    [Affects=Nothing, Replaceable] readonly attribute long screenY;
    [Affects=Nothing, Replaceable] readonly attribute long outerWidth;
    [Affects=Nothing, Replaceable] readonly attribute long outerHeight;
    [Affects=Nothing, Replaceable] readonly attribute double devicePixelRatio;

    // Selection API
    // https://w3c.github.io/selection-api/#extensions-to-window-interface
    [Affects=Nothing] Selection? getSelection();

    // Console API
    // https://console.spec.whatwg.org/#console-interface
    // [Replaceable] readonly attribute Console console;
    // Console is installed by v8 inspector when context is created
    // and is left commented here just for documentation.

    // Compatibility
    // https://compat.spec.whatwg.org/#windoworientation-interface
    [RuntimeEnabled=OrientationEvent] attribute EventHandler onorientationchange;
    // This is the interface orientation in degrees. Some examples are:
    //  0 is straight up; -90 is when the device is rotated 90 clockwise;
    //  90 is when rotated counter clockwise.
    [MeasureAs=WindowOrientation, RuntimeEnabled=OrientationEvent] readonly attribute long orientation;

    // Accessibility Object Model
    // https://github.com/WICG/aom/blob/HEAD/explainer.md
    [RuntimeEnabled=AccessibilityObjectModel, CallWith=ScriptState] Promise<ComputedAccessibleNode> getComputedAccessibleNode(Element element);

    // TODO(yhirano): Move this to url.idl when LegacyWindowAlias is supported.
    attribute URLConstructor webkitURL;

    // Non-standard APIs
    [MeasureAs=WindowClientInformation, Replaceable] readonly attribute Navigator clientInformation;
    [Replaceable, MeasureAs=WindowEvent, Custom=Getter, NotEnumerable] readonly attribute Event event;
    [MeasureAs=WindowFind] boolean find([Default=Undefined] optional DOMString string,
                                        [Default=Undefined] optional boolean caseSensitive,
                                        [Default=Undefined] optional boolean backwards,
                                        [Default=Undefined] optional boolean wrap,
                                        [Default=Undefined] optional boolean wholeWord,
                                        [Default=Undefined] optional boolean searchInFrames,
                                        [Default=Undefined] optional boolean showDialog);
    [MeasureAs=WindowOffscreenBuffering, Replaceable, NotEnumerable] readonly attribute boolean offscreenBuffering;
    [MeasureAs=WindowScreenLeft, Replaceable] readonly attribute long screenLeft;
    [MeasureAs=WindowScreenTop, Replaceable] readonly attribute long screenTop;
    [MeasureAs=WindowDefaultStatus] attribute DOMString defaultStatus;
    [MeasureAs=WindowDefaultstatus, ImplementedAs=defaultStatus] attribute DOMString defaultstatus;
    [MeasureAs=StyleMedia] readonly attribute StyleMedia styleMedia;
    [DeprecateAs=PrefixedRequestAnimationFrame] long webkitRequestAnimationFrame(FrameRequestCallback callback);
    [DeprecateAs=PrefixedCancelAnimationFrame, ImplementedAs=cancelAnimationFrame] void webkitCancelAnimationFrame(long id);
    [MeasureAs=PrefixedMutationObserverConstructor] attribute MutationObserverConstructor WebKitMutationObserver;

    // Event handler attributes
    attribute EventHandler onanimationend;
    attribute EventHandler onanimationiteration;
    attribute EventHandler onanimationstart;
    attribute EventHandler onsearch;
    attribute EventHandler ontransitionend;
    attribute EventHandler onwebkitanimationend;
    attribute EventHandler onwebkitanimationiteration;
    attribute EventHandler onwebkitanimationstart;
    attribute EventHandler onwebkittransitionend;

    // https://w3c.github.io/webappsec-secure-contexts/#monkey-patching-global-object
    readonly attribute boolean isSecureContext;

    attribute DOMMatrixConstructor WebKitCSSMatrix;

    //TrustedTypes API
    //http://github.com/wicg/trusted-types
    [RuntimeEnabled=TrustedDOMTypes] readonly attribute TrustedTypePolicyFactory TrustedTypes;
};

Window implements GlobalEventHandlers;
Window implements WindowBase64;
Window implements WindowEventHandlers;
Window implements WindowOrWorkerGlobalScope;
