/*
 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
 *
 * 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://w3c.github.io/uievents/#interface-MouseEvent

[
    Constructor(DOMString type, optional MouseEventInit eventInitDict),
    ConstructorCallWith=ScriptState
] interface MouseEvent : UIEvent {
    readonly attribute double           screenX;
    readonly attribute double           screenY;
    readonly attribute double           clientX;
    readonly attribute double           clientY;
    readonly attribute boolean          ctrlKey;
    readonly attribute boolean          shiftKey;
    readonly attribute boolean          altKey;
    readonly attribute boolean          metaKey;
    readonly attribute short            button;
    readonly attribute unsigned short   buttons;
    readonly attribute EventTarget?     relatedTarget;
    boolean getModifierState(DOMString keyArg);

    // https://w3c.github.io/uievents/#idl-interface-MouseEvent-initializers
    // TODO(foolip): None of the initMouseEvent() arguments should be optional.
    [CallWith=ScriptState, Measure] void initMouseEvent([Default=Undefined] optional DOMString type,
                                                        [Default=Undefined] optional boolean bubbles,
                                                        [Default=Undefined] optional boolean cancelable,
                                                        [Default=Undefined] optional Window? view,
                                                        [Default=Undefined] optional long detail,
                                                        [Default=Undefined] optional long screenX,
                                                        [Default=Undefined] optional long screenY,
                                                        [Default=Undefined] optional long clientX,
                                                        [Default=Undefined] optional long clientY,
                                                        [Default=Undefined] optional boolean ctrlKey,
                                                        [Default=Undefined] optional boolean altKey,
                                                        [Default=Undefined] optional boolean shiftKey,
                                                        [Default=Undefined] optional boolean metaKey,
                                                        [Default=Undefined] optional unsigned short button,
                                                        [Default=Undefined] optional EventTarget? relatedTarget);

    readonly attribute double pageX;
    readonly attribute double pageY;
    [MeasureAs=MouseEventX] readonly attribute double x;
    [MeasureAs=MouseEventY] readonly attribute double y;
    [MeasureAs=MouseEventOffsetX] readonly attribute double offsetX;
    [MeasureAs=MouseEventOffsetY] readonly attribute double offsetY;

    // Pointer Lock
    // https://w3c.github.io/pointerlock/#extensions-to-the-mouseevent-interface
    [MeasureAs=MouseEventMovementX] readonly attribute long movementX;
    [MeasureAs=MouseEventMovementY] readonly attribute long movementY;

    // Canvas Hit Regions
    // https://html.spec.whatwg.org/multipage/scripting.html#MouseEvent-partial
    [RuntimeEnabled=ExperimentalCanvasFeatures] readonly attribute DOMString? region;

    // Non-standard
    [MeasureAs=MouseEventFromElement] readonly attribute Node fromElement;
    [MeasureAs=MouseEventToElement] readonly attribute Node toElement;
    [Measure] readonly attribute long layerX;
    [Measure] readonly attribute long layerY;
};
