/*
 * Copyright (C) 2015 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.
 *
 * 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.
 *
 */

// https://html.spec.whatwg.org/multipage/webappapis.html#windoweventhandlers
[
    NoInterfaceObject,
] interface WindowEventHandlers {
    // Commented out event handlers are defined by the HTML5 specification but
    // are not yet implemented.

    // [WindowEventHandler] attribute EventHandler onafterprint;.
    // [WindowEventHandler] attribute EventHandler onbeforeprint;.
    [WindowEventHandler] attribute EventHandler onbeforeunload;
    [WindowEventHandler] attribute EventHandler onhashchange;
    [WindowEventHandler] attribute EventHandler onlanguagechange;
    [WindowEventHandler] attribute EventHandler onmessage;
    [WindowEventHandler] attribute EventHandler onoffline;
    [WindowEventHandler] attribute EventHandler ononline;
    [WindowEventHandler] attribute EventHandler onpagehide;
    [WindowEventHandler] attribute EventHandler onpageshow;
    [WindowEventHandler] attribute EventHandler onpopstate;
    [WindowEventHandler] attribute EventHandler onstorage;
    [WindowEventHandler] attribute EventHandler onunload;


    // Additions that are not yet part of the standard.

    [NotEnumerable, WindowEventHandler, Conditional=ORIENTATION_EVENTS] attribute EventHandler onorientationchange;
};
