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

#ifndef DOMEventsClasses_H
#define DOMEventsClasses_H

#include "WebKit.h"
#include "DOMCoreClasses.h"
#include <WebCore/EventListener.h>

#include <wtf/RefPtr.h>

// {AC3D1BC3-4976-4431-8A19-4812C5EFE39C}
DEFINE_GUID(IID_DOMEvent, 0xac3d1bc3, 0x4976, 0x4431, 0x8a, 0x19, 0x48, 0x12, 0xc5, 0xef, 0xe3, 0x9c);

namespace WebCore {
    class Event;
}

class DOMUIEvent;

class WebEventListener : public WebCore::EventListener {
public:
    WebEventListener(IDOMEventListener*);
    ~WebEventListener();
    virtual bool operator==(const EventListener&) const;
    virtual void handleEvent(WebCore::ScriptExecutionContext&, WebCore::Event&);
    static Ref<WebEventListener> create(IDOMEventListener*);
private:
    IDOMEventListener* m_iDOMEventListener;
};

class DOMEventListener : public DOMObject, public IDOMEventListener
{
public:
    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMObject::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMObject::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEventListener
    virtual HRESULT STDMETHODCALLTYPE handleEvent(_In_opt_ IDOMEvent*);
};

class DOMEvent : public DOMObject, public IDOMEvent
{
public:
    static IDOMEvent* createInstance(RefPtr<WebCore::Event>&&);
protected:
    DOMEvent(RefPtr<WebCore::Event>&&);
    ~DOMEvent();

public:
    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMObject::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMObject::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR*);
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget**);
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget**);
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result);
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result);
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result);
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result);
    virtual HRESULT STDMETHODCALLTYPE stopPropagation();
    virtual HRESULT STDMETHODCALLTYPE preventDefault();
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg);

    // DOMEvent methods
    WebCore::Event* coreEvent() { return m_event.get(); }

protected:
    RefPtr<WebCore::Event> m_event;
};

class DOMUIEvent : public DOMEvent, public IDOMUIEvent
{
public:
    DOMUIEvent(RefPtr<WebCore::Event>&& e)
        : DOMEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    {
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault()
    {
        return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMUIEvent
    virtual HRESULT STDMETHODCALLTYPE view(_COM_Outptr_opt_ IDOMWindow**);
    virtual HRESULT STDMETHODCALLTYPE detail(_Out_ long* result);
    virtual HRESULT STDMETHODCALLTYPE initUIEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable, _In_opt_ IDOMWindow* view, long detail);
    virtual HRESULT STDMETHODCALLTYPE keyCode(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE charCode(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE unused1(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE unused2(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE pageX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE pageY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE which(_Out_ long*);
};

class DOMKeyboardEvent : public DOMUIEvent, public IDOMKeyboardEvent
{
public:
    DOMKeyboardEvent(RefPtr<WebCore::Event>&& e)
        : DOMUIEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMUIEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMUIEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    {
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault()
    {
        return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMUIEvent
    virtual HRESULT STDMETHODCALLTYPE view(_COM_Outptr_opt_ IDOMWindow** result)
    {
        return DOMUIEvent::view(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE detail( 
        /* [retval][out] */ long* result) { return DOMUIEvent::detail(result); }
    
    virtual HRESULT STDMETHODCALLTYPE initUIEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable, _In_opt_ IDOMWindow* view, long detail)
    {
        return DOMUIEvent::initUIEvent(type, canBubble, cancelable, view, detail);
    }
    
    virtual HRESULT STDMETHODCALLTYPE keyCode(_Out_ long* result)
    {
        return DOMUIEvent::keyCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE charCode(_Out_ long* result)
    {
        return DOMUIEvent::charCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused1(_Out_ long* result)
    {
        return DOMUIEvent::unused1(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused2(_Out_ long* result)
    {
        return DOMUIEvent::unused2(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageX(_Out_ long* result)
    {
        return DOMUIEvent::pageX(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageY(_Out_ long* result)
    {
        return DOMUIEvent::pageY(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE which(_Out_ long* result)
    {
        return DOMUIEvent::which(result);
    }

    // IDOMKeyboardEvent
    virtual HRESULT STDMETHODCALLTYPE keyIdentifier(__deref_opt_out BSTR* result);
    virtual HRESULT STDMETHODCALLTYPE location(_Out_ unsigned long*);
    virtual HRESULT STDMETHODCALLTYPE keyLocation(_Out_ unsigned long*);
    virtual HRESULT STDMETHODCALLTYPE ctrlKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE shiftKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE altKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE metaKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE altGraphKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE getModifierState(_In_ BSTR keyIdentifierArg, _Out_ BOOL* result);
    virtual HRESULT STDMETHODCALLTYPE initKeyboardEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable,
        _In_opt_ IDOMWindow* view, _In_ BSTR keyIdentifier, unsigned long keyLocation, BOOL ctrlKey,
        BOOL altKey, BOOL shiftKey, BOOL metaKey, BOOL graphKey);
};

class DOMMouseEvent : public DOMUIEvent, public IDOMMouseEvent
{
public:
    DOMMouseEvent(RefPtr<WebCore::Event>&& e)
        : DOMUIEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMUIEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMUIEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    {
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault()
    {
        return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMUIEvent
    virtual HRESULT STDMETHODCALLTYPE view(_COM_Outptr_opt_ IDOMWindow** result)
    {
        return DOMUIEvent::view(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE detail(_Out_ long* result)
    {
        return DOMUIEvent::detail(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE initUIEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable, _In_opt_ IDOMWindow* view, long detail)
    {
        return DOMUIEvent::initUIEvent(type, canBubble, cancelable, view, detail);
    }
    
    virtual HRESULT STDMETHODCALLTYPE keyCode(_Out_ long* result)
    {
        return DOMUIEvent::keyCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE charCode(_Out_ long* result)
    {
        return DOMUIEvent::charCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused1(_Out_ long* result)
    {
        return DOMUIEvent::unused1(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused2(_Out_ long* result)
    {
        return DOMUIEvent::unused2(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageX(_Out_ long* result)
    {
        return DOMUIEvent::pageX(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageY(_Out_ long* result)
    {
        return DOMUIEvent::pageY(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE which(_Out_ long* result)
    {
        return DOMUIEvent::which(result);
    }

    // IDOMMouseEvent
    virtual HRESULT STDMETHODCALLTYPE screenX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE screenY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE clientX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE clientY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE ctrlKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE shiftKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE altKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE metaKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE button(_Out_ unsigned short*);
    virtual HRESULT STDMETHODCALLTYPE relatedTarget(_COM_Outptr_opt_ IDOMEventTarget**);
    virtual HRESULT STDMETHODCALLTYPE initMouseEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable, _In_opt_ IDOMWindow* view,
        long detail, long screenX, long screenY, long clientX, long clientY, BOOL ctrlKey, BOOL altKey, BOOL shiftKey, BOOL metaKey,
        unsigned short button, _In_opt_ IDOMEventTarget* relatedTarget);
    virtual HRESULT STDMETHODCALLTYPE offsetX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE offsetY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE x(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE y(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE fromElement(_COM_Outptr_opt_ IDOMNode**);
    virtual HRESULT STDMETHODCALLTYPE toElement(_COM_Outptr_opt_ IDOMNode**);
};

class DOMMutationEvent : public DOMEvent, public IDOMMutationEvent
{
public:
    DOMMutationEvent(RefPtr<WebCore::Event>&& e)
        : DOMEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    { 
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault()
    {
        return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMMutationEvent
    virtual HRESULT STDMETHODCALLTYPE relatedNode(_COM_Outptr_opt_ IDOMNode**);
    virtual HRESULT STDMETHODCALLTYPE prevValue(__deref_opt_out BSTR* result);
    virtual HRESULT STDMETHODCALLTYPE newValue(__deref_opt_out BSTR* result);
    virtual HRESULT STDMETHODCALLTYPE attrName(__deref_opt_out BSTR* result);
    virtual HRESULT STDMETHODCALLTYPE attrChange(_Out_ unsigned short* result);
    virtual HRESULT STDMETHODCALLTYPE initMutationEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable,
        _In_opt_ IDOMNode* relatedNode, _In_ BSTR prevValue, _In_ BSTR newValue, _In_ BSTR attrName,
        unsigned short attrChange);
};

class DOMOverflowEvent : public DOMEvent, public IDOMOverflowEvent
{
public:
    DOMOverflowEvent(RefPtr<WebCore::Event>&& e)
        : DOMEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    {
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault() 
    {
        return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMOverflowEvent
    virtual HRESULT STDMETHODCALLTYPE orient(_Out_ unsigned short*);
    virtual HRESULT STDMETHODCALLTYPE horizontalOverflow(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE verticalOverflow(_Out_ BOOL*);
};

class DOMWheelEvent : public DOMUIEvent, public IDOMWheelEvent
{
public:
    DOMWheelEvent(RefPtr<WebCore::Event>&& e)
        : DOMUIEvent(WTFMove(e))
    { }

    // IUnknown
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(_In_ REFIID riid, _COM_Outptr_ void** ppvObject);
    virtual ULONG STDMETHODCALLTYPE AddRef() { return DOMUIEvent::AddRef(); }
    virtual ULONG STDMETHODCALLTYPE Release() { return DOMUIEvent::Release(); }

    // IWebScriptObject
    virtual HRESULT STDMETHODCALLTYPE throwException(_In_ BSTR exceptionMessage, _Out_ BOOL* result)
    {
        return DOMObject::throwException(exceptionMessage, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE callWebScriptMethod(_In_ BSTR name, __in_ecount_opt(cArgs) const VARIANT args[], int cArgs, _Out_ VARIANT* result)
    {
        return DOMObject::callWebScriptMethod(name, args, cArgs, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE evaluateWebScript(_In_ BSTR script, _Out_ VARIANT* result)
    {
        return DOMObject::evaluateWebScript(script, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE removeWebScriptKey(_In_ BSTR name)
    {
        return DOMObject::removeWebScriptKey(name);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stringRepresentation(__deref_opt_out BSTR* stringRepresentation)
    {
        return DOMObject::stringRepresentation(stringRepresentation);
    }
    
    virtual HRESULT STDMETHODCALLTYPE webScriptValueAtIndex(unsigned index, _Out_ VARIANT* result)
    {
        return DOMObject::webScriptValueAtIndex(index, result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setWebScriptValueAtIndex(unsigned index, VARIANT val)
    {
        return DOMObject::setWebScriptValueAtIndex(index, val);
    }
    
    virtual HRESULT STDMETHODCALLTYPE setException(_In_ BSTR description)
    {
        return DOMObject::setException(description);
    }

    // IDOMEvent
    virtual HRESULT STDMETHODCALLTYPE type(__deref_opt_out BSTR* result)
    {
        return DOMEvent::type(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE target(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::target(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE currentTarget(_COM_Outptr_opt_ IDOMEventTarget** result)
    {
        return DOMEvent::currentTarget(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE eventPhase(_Out_ unsigned short* result)
    {
        return DOMEvent::eventPhase(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE bubbles(_Out_ BOOL* result)
    {
        return DOMEvent::bubbles(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE cancelable(_Out_ BOOL* result)
    { 
        return DOMEvent::cancelable(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE timeStamp(_Out_ EpochTimeStamp* result)
    {
        return DOMEvent::timeStamp(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE stopPropagation()
    {
        return DOMEvent::stopPropagation();
    }
    
    virtual HRESULT STDMETHODCALLTYPE preventDefault()
    { return DOMEvent::preventDefault();
    }
    
    virtual HRESULT STDMETHODCALLTYPE initEvent(_In_ BSTR eventTypeArg, BOOL canBubbleArg, BOOL cancelableArg)
    {
        return DOMEvent::initEvent(eventTypeArg, canBubbleArg, cancelableArg);
    }

    // IDOMUIEvent
    virtual HRESULT STDMETHODCALLTYPE view(_COM_Outptr_opt_ IDOMWindow** result)
    {
        return DOMUIEvent::view(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE detail(_Out_ long* result)
    {
        return DOMUIEvent::detail(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE initUIEvent(_In_ BSTR type, BOOL canBubble, BOOL cancelable, _In_opt_ IDOMWindow* view, long detail)
    {
        return DOMUIEvent::initUIEvent(type, canBubble, cancelable, view, detail);
    }
    
    virtual HRESULT STDMETHODCALLTYPE keyCode(_Out_ long* result)
    {
        return DOMUIEvent::keyCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE charCode(_Out_ long* result)
    {
        return DOMUIEvent::charCode(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused1(_Out_ long* result)
    {
        return DOMUIEvent::unused1(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE unused2(_Out_ long* result)
    {
        return DOMUIEvent::unused2(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageX(_Out_ long* result)
    {
        return DOMUIEvent::pageX(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE pageY(_Out_ long* result)
    {
        return DOMUIEvent::pageY(result);
    }
    
    virtual HRESULT STDMETHODCALLTYPE which(_Out_ long* result)
    {
        return DOMUIEvent::which(result);
    }

    // IDOMWheelEvent
    virtual HRESULT STDMETHODCALLTYPE screenX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE screenY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE clientX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE clientY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE ctrlKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE shiftKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE altKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE metaKey(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE wheelDelta(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE wheelDeltaX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE wheelDeltaY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE offsetX(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE offsetY(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE x(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE y(_Out_ long*);
    virtual HRESULT STDMETHODCALLTYPE isHorizontal(_Out_ BOOL*);
    virtual HRESULT STDMETHODCALLTYPE initWheelEvent(long wheelDeltaX, long wheelDeltaY,
        _In_opt_ IDOMWindow* view, long screenX, long screenY, long clientX, long clientY,
        BOOL ctrlKey, BOOL altKey, BOOL shiftKey, BOOL metaKey);
};

#endif
