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

[
    DoNotCheckConstants,
] interface MouseEvent : UIEvent {
    constructor(DOMString type, optional MouseEventInit eventInitDict);

    [Conditional=MOUSE_FORCE_EVENTS] const double WEBKIT_FORCE_AT_MOUSE_DOWN = 1;
    [Conditional=MOUSE_FORCE_EVENTS] const double WEBKIT_FORCE_AT_FORCE_MOUSE_DOWN = 2;

    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;

    boolean getModifierState(DOMString keyArg);

    [Conditional=POINTER_LOCK] readonly attribute long movementX;
    [Conditional=POINTER_LOCK] readonly attribute long movementY;
    [Conditional=MOUSE_FORCE_EVENTS, ImplementedAs=force]readonly attribute double webkitForce;

    // FIXME: Using "undefined" as default parameter value is wrong.
    // FIXME: relatedTarget should be of type EventTarget? but we need to use any to support a quirk for iAd Producer (rdar://problem/30640101).
    [CallWith=GlobalObject&ScriptExecutionContext, ImplementedAs=initMouseEventQuirk] void initMouseEvent(optional DOMString type = "undefined",
        optional boolean canBubble = false, optional boolean cancelable = false,
        optional WindowProxy? view = null, optional long detail = 0,
        optional long screenX = 0, optional long screenY = 0, optional long clientX = 0, optional long clientY = 0,
        optional boolean ctrlKey = false, optional boolean altKey = false, optional boolean shiftKey = false, optional boolean metaKey = false,
        optional short button = 0, optional any relatedTarget = null);

    readonly attribute long offsetX;
    readonly attribute long offsetY;
    readonly attribute long x;
    readonly attribute long y;
    readonly attribute Node? fromElement;
    readonly attribute Node? toElement;
};
