/*
 * 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 long             screenX;
    readonly attribute long             screenY;
    readonly attribute long             clientX;
    readonly attribute long             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;
    // TODO(philipj): boolean getModifierState(DOMString keyArg);

    // https://w3c.github.io/uievents/#idl-interface-MouseEvent-initializers
    // TODO(philipj): 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);

    // CSSOM View Module
    // http://dev.w3.org/csswg/cssom-view/#extensions-to-the-mouseevent-interface
    // TODO(philipj): These attributes should be of type double, and the spec
    // also redefines screenX/Y and clientX/Y as double.
    readonly attribute long pageX;
    readonly attribute long pageY;
    [MeasureAs=MouseEventX] readonly attribute long x;
    [MeasureAs=MouseEventY] readonly attribute long y;
    [MeasureAs=MouseEventOffsetX] readonly attribute long offsetX;
    [MeasureAs=MouseEventOffsetY] readonly attribute long offsetY;

    // Pointer Lock
    // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#extensions-to-the-mouseevent-interface
    [MeasureAs=MouseEventMovementX] readonly attribute long movementX;
    [MeasureAs=MouseEventMovementY] readonly attribute long movementY;

    // Non-standard
    [MeasureAs=MouseEventFromElement] readonly attribute Node fromElement;
    [MeasureAs=MouseEventToElement] readonly attribute Node toElement;
    [MeasureAs=MouseEventWhich] readonly attribute long which;
    [DeprecateAs=PrefixedMouseEventMovementX, ImplementedAs=movementX] readonly attribute long webkitMovementX;
    [DeprecateAs=PrefixedMouseEventMovementY, ImplementedAs=movementY] readonly attribute long webkitMovementY;
    [Measure] readonly attribute long layerX;
    [Measure] readonly attribute long layerY;

    // FIXME: dataTransfer belongs on the DragEvent interface. crbug.com/498504
    readonly attribute DataTransfer dataTransfer;
};
