/*
 * Copyright (C) 2006, 2007, 2009, 2011 Apple Inc. All rights reserved.
 * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

// https://dom.spec.whatwg.org/#interface-event

[
    Constructor(DOMString type, optional EventInit eventInitDict),
    Exposed=(Window,Worker)
] interface Event {
    readonly attribute DOMString type;
    readonly attribute EventTarget? target;
    readonly attribute EventTarget? currentTarget;
    [MeasureAs=EventComposedPath, CallWith=ScriptState] sequence<EventTarget> composedPath();

    const unsigned short NONE = 0;
    const unsigned short CAPTURING_PHASE = 1;
    const unsigned short AT_TARGET = 2;
    const unsigned short BUBBLING_PHASE = 3;
    readonly attribute unsigned short eventPhase;

    [Measure] void stopPropagation();
    [Measure] void stopImmediatePropagation();

    readonly attribute boolean bubbles;
    readonly attribute boolean cancelable;
    void preventDefault();
    readonly attribute boolean defaultPrevented;

    [MeasureAs=EventComposed] readonly attribute boolean composed;

    [Unforgeable] readonly attribute boolean isTrusted;

    [CallWith=ScriptState] readonly attribute DOMHighResTimeStamp timeStamp;

    [Measure] void initEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false);

    // Non-standard APIs
    [MeasureAs=EventSrcElement] readonly attribute EventTarget srcElement;
    [MeasureAs=EventReturnValue, CallWith=ScriptState, ImplementedAs=legacyReturnValue] attribute boolean returnValue;
    [MeasureAs=EventCancelBubble, CallWith=ScriptState] attribute boolean cancelBubble;
    [MeasureAs=EventPath, CallWith=ScriptState] readonly attribute object path;
};
