2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "WebKitDLL.h"
29 #include "DOMEventsClasses.h"
31 #include <WebCore/COMPtr.h>
32 #include <WebCore/DOMWindow.h>
33 #include <WebCore/Event.h>
34 #include <WebCore/EventNames.h>
35 #include <WebCore/KeyboardEvent.h>
36 #include <WebCore/MouseEvent.h>
37 #include <WebCore/ScriptExecutionContext.h>
39 // DOMEventListener -----------------------------------------------------------
41 HRESULT STDMETHODCALLTYPE DOMEventListener::QueryInterface(const IID &riid, void** ppvObject)
44 if (IsEqualGUID(riid, IID_IDOMEventListener))
45 *ppvObject = static_cast<IDOMEventListener*>(this);
47 return DOMObject::QueryInterface(riid, ppvObject);
53 HRESULT STDMETHODCALLTYPE DOMEventListener::handleEvent(
54 /* [in] */ IDOMEvent* /*evt*/)
59 WebEventListener::WebEventListener(IDOMEventListener* i)
60 : EventListener(CPPEventListenerType)
61 , m_iDOMEventListener(i)
63 m_iDOMEventListener->AddRef();
66 WebEventListener::~WebEventListener()
68 m_iDOMEventListener->Release();
71 bool WebEventListener::operator==(const WebCore::EventListener& other)
73 return (other.type() == CPPEventListenerType
74 && reinterpret_cast<const WebEventListener*>(&other)->m_iDOMEventListener == m_iDOMEventListener);
77 void WebEventListener::handleEvent(WebCore::ScriptExecutionContext* s, WebCore::Event* e)
79 RefPtr<WebCore::Event> ePtr(e);
80 COMPtr<IDOMEvent> domEvent = DOMEvent::createInstance(ePtr);
81 m_iDOMEventListener->handleEvent(domEvent.get());
84 PassRefPtr<WebEventListener> WebEventListener::create(IDOMEventListener* d)
86 return adoptRef(new WebEventListener(d));
89 // DOMEvent -------------------------------------------------------------------
91 DOMEvent::DOMEvent(PassRefPtr<WebCore::Event> e)
101 IDOMEvent* DOMEvent::createInstance(PassRefPtr<WebCore::Event> e)
107 IDOMEvent* domEvent = 0;
109 if (e->isKeyboardEvent()) {
110 DOMKeyboardEvent* newEvent = new DOMKeyboardEvent(e);
111 hr = newEvent->QueryInterface(IID_IDOMKeyboardEvent, (void**)&domEvent);
112 } else if (e->isMouseEvent()) {
113 DOMMouseEvent* newEvent = new DOMMouseEvent(e);
114 hr = newEvent->QueryInterface(IID_IDOMMouseEvent, (void**)&domEvent);
115 } else if (e->hasInterface(WebCore::eventNames().interfaceForMutationEvent)) {
116 DOMMutationEvent* newEvent = new DOMMutationEvent(e);
117 hr = newEvent->QueryInterface(IID_IDOMMutationEvent, (void**)&domEvent);
118 } else if (e->hasInterface(WebCore::eventNames().interfaceForOverflowEvent)) {
119 DOMOverflowEvent* newEvent = new DOMOverflowEvent(e);
120 hr = newEvent->QueryInterface(IID_IDOMOverflowEvent, (void**)&domEvent);
121 } else if (e->hasInterface(WebCore::eventNames().interfaceForWheelEvent)) {
122 DOMWheelEvent* newEvent = new DOMWheelEvent(e);
123 hr = newEvent->QueryInterface(IID_IDOMWheelEvent, (void**)&domEvent);
124 } else if (e->isUIEvent()) {
125 DOMUIEvent* newEvent = new DOMUIEvent(e);
126 hr = newEvent->QueryInterface(IID_IDOMUIEvent, (void**)&domEvent);
128 DOMEvent* newEvent = new DOMEvent(e);
129 hr = newEvent->QueryInterface(IID_IDOMEvent, (void**)&domEvent);
138 HRESULT STDMETHODCALLTYPE DOMEvent::QueryInterface(const IID &riid, void** ppvObject)
141 if (IsEqualGUID(riid, IID_DOMEvent))
143 else if (IsEqualGUID(riid, IID_IDOMEvent))
144 *ppvObject = static_cast<IDOMEvent*>(this);
146 return DOMObject::QueryInterface(riid, ppvObject);
152 HRESULT STDMETHODCALLTYPE DOMEvent::type(
153 /* [retval][out] */ BSTR* /*result*/)
158 HRESULT STDMETHODCALLTYPE DOMEvent::target(
159 /* [retval][out] */ IDOMEventTarget** /*result*/)
164 HRESULT STDMETHODCALLTYPE DOMEvent::currentTarget(
165 /* [retval][out] */ IDOMEventTarget** /*result*/)
170 HRESULT STDMETHODCALLTYPE DOMEvent::eventPhase(
171 /* [retval][out] */ unsigned short* /*result*/)
176 HRESULT STDMETHODCALLTYPE DOMEvent::bubbles(
177 /* [retval][out] */ BOOL* /*result*/)
182 HRESULT STDMETHODCALLTYPE DOMEvent::cancelable(
183 /* [retval][out] */ BOOL* /*result*/)
188 HRESULT STDMETHODCALLTYPE DOMEvent::timeStamp(
189 /* [retval][out] */ DOMTimeStamp* /*result*/)
194 HRESULT STDMETHODCALLTYPE DOMEvent::stopPropagation( void)
199 HRESULT STDMETHODCALLTYPE DOMEvent::preventDefault( void)
204 HRESULT STDMETHODCALLTYPE DOMEvent::initEvent(
205 /* [in] */ BSTR /*eventTypeArg*/,
206 /* [in] */ BOOL /*canBubbleArg*/,
207 /* [in] */ BOOL /*cancelableArg*/)
212 // DOMUIEvent -----------------------------------------------------------------
214 HRESULT STDMETHODCALLTYPE DOMUIEvent::QueryInterface(REFIID riid, void** ppvObject)
217 if (IsEqualGUID(riid, IID_IDOMUIEvent))
218 *ppvObject = static_cast<IDOMUIEvent*>(this);
220 return DOMEvent::QueryInterface(riid, ppvObject);
226 HRESULT STDMETHODCALLTYPE DOMUIEvent::view(
227 /* [retval][out] */ IDOMWindow** /*result*/)
232 HRESULT STDMETHODCALLTYPE DOMUIEvent::detail(
233 /* [retval][out] */ long* /*result*/)
238 HRESULT STDMETHODCALLTYPE DOMUIEvent::initUIEvent(
239 /* [in] */ BSTR /*type*/,
240 /* [in] */ BOOL /*canBubble*/,
241 /* [in] */ BOOL /*cancelable*/,
242 /* [in] */ IDOMWindow* /*view*/,
243 /* [in] */ long /*detail*/)
248 HRESULT STDMETHODCALLTYPE DOMUIEvent::keyCode(
249 /* [retval][out] */ long* /*result*/)
254 HRESULT STDMETHODCALLTYPE DOMUIEvent::charCode(
255 /* [retval][out] */ long* /*result*/)
260 HRESULT STDMETHODCALLTYPE DOMUIEvent::unused1(
261 /* [retval][out] */ long* /*result*/)
266 HRESULT STDMETHODCALLTYPE DOMUIEvent::unused2(
267 /* [retval][out] */ long* /*result*/)
272 HRESULT STDMETHODCALLTYPE DOMUIEvent::pageX(
273 /* [retval][out] */ long* /*result*/)
278 HRESULT STDMETHODCALLTYPE DOMUIEvent::pageY(
279 /* [retval][out] */ long* /*result*/)
284 HRESULT STDMETHODCALLTYPE DOMUIEvent::which(
285 /* [retval][out] */ long* /*result*/)
290 // DOMKeyboardEvent -----------------------------------------------------------
292 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::QueryInterface(REFIID riid, void** ppvObject)
295 if (IsEqualGUID(riid, IID_IDOMKeyboardEvent))
296 *ppvObject = static_cast<IDOMKeyboardEvent*>(this);
298 return DOMUIEvent::QueryInterface(riid, ppvObject);
304 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::keyIdentifier(
305 /* [retval][out] */ BSTR* /*result*/)
310 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::keyLocation(
311 /* [retval][out] */ unsigned long* /*result*/)
316 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::ctrlKey(
317 /* [retval][out] */ BOOL* result)
320 if (!m_event || !m_event->isKeyboardEvent())
322 WebCore::KeyboardEvent* keyEvent = static_cast<WebCore::KeyboardEvent*>(m_event.get());
324 *result = keyEvent->ctrlKey() ? TRUE : FALSE;
328 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::shiftKey(
329 /* [retval][out] */ BOOL* result)
332 if (!m_event || !m_event->isKeyboardEvent())
334 WebCore::KeyboardEvent* keyEvent = static_cast<WebCore::KeyboardEvent*>(m_event.get());
336 *result = keyEvent->shiftKey() ? TRUE : FALSE;
340 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::altKey(
341 /* [retval][out] */ BOOL* result)
344 if (!m_event || !m_event->isKeyboardEvent())
346 WebCore::KeyboardEvent* keyEvent = static_cast<WebCore::KeyboardEvent*>(m_event.get());
348 *result = keyEvent->altKey() ? TRUE : FALSE;
352 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::metaKey(
353 /* [retval][out] */ BOOL* result)
356 if (!m_event || !m_event->isKeyboardEvent())
358 WebCore::KeyboardEvent* keyEvent = static_cast<WebCore::KeyboardEvent*>(m_event.get());
360 *result = keyEvent->metaKey() ? TRUE : FALSE;
364 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::altGraphKey(
365 /* [retval][out] */ BOOL* result)
368 if (!m_event || !m_event->isKeyboardEvent())
370 WebCore::KeyboardEvent* keyEvent = static_cast<WebCore::KeyboardEvent*>(m_event.get());
372 *result = keyEvent->altGraphKey() ? TRUE : FALSE;
376 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::getModifierState(
377 /* [in] */ BSTR /*keyIdentifierArg*/,
378 /* [retval][out] */ BOOL* /*result*/)
383 HRESULT STDMETHODCALLTYPE DOMKeyboardEvent::initKeyboardEvent(
384 /* [in] */ BSTR /*type*/,
385 /* [in] */ BOOL /*canBubble*/,
386 /* [in] */ BOOL /*cancelable*/,
387 /* [in] */ IDOMWindow* /*view*/,
388 /* [in] */ BSTR /*keyIdentifier*/,
389 /* [in] */ unsigned long /*keyLocation*/,
390 /* [in] */ BOOL /*ctrlKey*/,
391 /* [in] */ BOOL /*altKey*/,
392 /* [in] */ BOOL /*shiftKey*/,
393 /* [in] */ BOOL /*metaKey*/,
394 /* [in] */ BOOL /*graphKey*/)
399 // DOMMouseEvent --------------------------------------------------------------
401 HRESULT STDMETHODCALLTYPE DOMMouseEvent::QueryInterface(REFIID riid, void** ppvObject)
404 if (IsEqualGUID(riid, IID_IDOMMouseEvent))
405 *ppvObject = static_cast<IDOMMouseEvent*>(this);
407 return DOMUIEvent::QueryInterface(riid, ppvObject);
413 HRESULT STDMETHODCALLTYPE DOMMouseEvent::screenX(
414 /* [retval][out] */ long* /*result*/)
419 HRESULT STDMETHODCALLTYPE DOMMouseEvent::screenY(
420 /* [retval][out] */ long* /*result*/)
425 HRESULT STDMETHODCALLTYPE DOMMouseEvent::clientX(
426 /* [retval][out] */ long* /*result*/)
431 HRESULT STDMETHODCALLTYPE DOMMouseEvent::clientY(
432 /* [retval][out] */ long* /*result*/)
437 HRESULT STDMETHODCALLTYPE DOMMouseEvent::ctrlKey(
438 /* [retval][out] */ BOOL* result)
441 if (!m_event || !m_event->isMouseEvent())
443 WebCore::MouseEvent* mouseEvent = static_cast<WebCore::MouseEvent*>(m_event.get());
445 *result = mouseEvent->ctrlKey() ? TRUE : FALSE;
449 HRESULT STDMETHODCALLTYPE DOMMouseEvent::shiftKey(
450 /* [retval][out] */ BOOL* result)
453 if (!m_event || !m_event->isMouseEvent())
455 WebCore::MouseEvent* mouseEvent = static_cast<WebCore::MouseEvent*>(m_event.get());
457 *result = mouseEvent->shiftKey() ? TRUE : FALSE;
461 HRESULT STDMETHODCALLTYPE DOMMouseEvent::altKey(
462 /* [retval][out] */ BOOL* result)
465 if (!m_event || !m_event->isMouseEvent())
467 WebCore::MouseEvent* mouseEvent = static_cast<WebCore::MouseEvent*>(m_event.get());
469 *result = mouseEvent->altKey() ? TRUE : FALSE;
473 HRESULT STDMETHODCALLTYPE DOMMouseEvent::metaKey(
474 /* [retval][out] */ BOOL* result)
477 if (!m_event || !m_event->isMouseEvent())
479 WebCore::MouseEvent* mouseEvent = static_cast<WebCore::MouseEvent*>(m_event.get());
481 *result = mouseEvent->metaKey() ? TRUE : FALSE;
485 HRESULT STDMETHODCALLTYPE DOMMouseEvent::button(
486 /* [retval][out] */ unsigned short* /*result*/)
491 HRESULT STDMETHODCALLTYPE DOMMouseEvent::relatedTarget(
492 /* [retval][out] */ IDOMEventTarget** /*result*/)
497 HRESULT STDMETHODCALLTYPE DOMMouseEvent::initMouseEvent(
498 /* [in] */ BSTR /*type*/,
499 /* [in] */ BOOL /*canBubble*/,
500 /* [in] */ BOOL /*cancelable*/,
501 /* [in] */ IDOMWindow* /*view*/,
502 /* [in] */ long /*detail*/,
503 /* [in] */ long /*screenX*/,
504 /* [in] */ long /*screenY*/,
505 /* [in] */ long /*clientX*/,
506 /* [in] */ long /*clientY*/,
507 /* [in] */ BOOL /*ctrlKey*/,
508 /* [in] */ BOOL /*altKey*/,
509 /* [in] */ BOOL /*shiftKey*/,
510 /* [in] */ BOOL /*metaKey*/,
511 /* [in] */ unsigned short /*button*/,
512 /* [in] */ IDOMEventTarget* /*relatedTarget*/)
517 HRESULT STDMETHODCALLTYPE DOMMouseEvent::offsetX(
518 /* [retval][out] */ long* /*result*/)
523 HRESULT STDMETHODCALLTYPE DOMMouseEvent::offsetY(
524 /* [retval][out] */ long* /*result*/)
529 HRESULT STDMETHODCALLTYPE DOMMouseEvent::x(
530 /* [retval][out] */ long* /*result*/)
535 HRESULT STDMETHODCALLTYPE DOMMouseEvent::y(
536 /* [retval][out] */ long* /*result*/)
541 HRESULT STDMETHODCALLTYPE DOMMouseEvent::fromElement(
542 /* [retval][out] */ IDOMNode** /*result*/)
547 HRESULT STDMETHODCALLTYPE DOMMouseEvent::toElement(
548 /* [retval][out] */ IDOMNode** /*result*/)
553 // DOMMutationEvent -----------------------------------------------------------
555 HRESULT STDMETHODCALLTYPE DOMMutationEvent::QueryInterface(REFIID riid, void** ppvObject)
558 if (IsEqualGUID(riid, IID_IDOMMutationEvent))
559 *ppvObject = static_cast<IDOMMutationEvent*>(this);
561 return DOMEvent::QueryInterface(riid, ppvObject);
567 HRESULT STDMETHODCALLTYPE DOMMutationEvent::relatedNode(
568 /* [retval][out] */ IDOMNode** /*result*/)
573 HRESULT STDMETHODCALLTYPE DOMMutationEvent::prevValue(
574 /* [retval][out] */ BSTR* /*result*/)
579 HRESULT STDMETHODCALLTYPE DOMMutationEvent::newValue(
580 /* [retval][out] */ BSTR* /*result*/)
585 HRESULT STDMETHODCALLTYPE DOMMutationEvent::attrName(
586 /* [retval][out] */ BSTR* /*result*/)
591 HRESULT STDMETHODCALLTYPE DOMMutationEvent::attrChange(
592 /* [retval][out] */ unsigned short* /*result*/)
597 HRESULT STDMETHODCALLTYPE DOMMutationEvent::initMutationEvent(
598 /* [in] */ BSTR /*type*/,
599 /* [in] */ BOOL /*canBubble*/,
600 /* [in] */ BOOL /*cancelable*/,
601 /* [in] */ IDOMNode* /*relatedNode*/,
602 /* [in] */ BSTR /*prevValue*/,
603 /* [in] */ BSTR /*newValue*/,
604 /* [in] */ BSTR /*attrName*/,
605 /* [in] */ unsigned short /*attrChange*/)
610 // DOMOverflowEvent -----------------------------------------------------------
612 HRESULT STDMETHODCALLTYPE DOMOverflowEvent::QueryInterface(REFIID riid, void** ppvObject)
615 if (IsEqualGUID(riid, IID_IDOMOverflowEvent))
616 *ppvObject = static_cast<IDOMOverflowEvent*>(this);
618 return DOMEvent::QueryInterface(riid, ppvObject);
624 HRESULT STDMETHODCALLTYPE DOMOverflowEvent::orient(
625 /* [retval][out] */ unsigned short* /*result*/)
630 HRESULT STDMETHODCALLTYPE DOMOverflowEvent::horizontalOverflow(
631 /* [retval][out] */ BOOL* /*result*/)
636 HRESULT STDMETHODCALLTYPE DOMOverflowEvent::verticalOverflow(
637 /* [retval][out] */ BOOL* /*result*/)
642 // DOMWheelEvent --------------------------------------------------------------
644 HRESULT STDMETHODCALLTYPE DOMWheelEvent::QueryInterface(REFIID riid, void** ppvObject)
647 if (IsEqualGUID(riid, IID_IDOMWheelEvent))
648 *ppvObject = static_cast<IDOMWheelEvent*>(this);
650 return DOMUIEvent::QueryInterface(riid, ppvObject);
656 HRESULT STDMETHODCALLTYPE DOMWheelEvent::screenX(
657 /* [retval][out] */ long* /*result*/)
662 HRESULT STDMETHODCALLTYPE DOMWheelEvent::screenY(
663 /* [retval][out] */ long* /*result*/)
668 HRESULT STDMETHODCALLTYPE DOMWheelEvent::clientX(
669 /* [retval][out] */ long* /*result*/)
674 HRESULT STDMETHODCALLTYPE DOMWheelEvent::clientY(
675 /* [retval][out] */ long* /*result*/)
680 HRESULT STDMETHODCALLTYPE DOMWheelEvent::ctrlKey(
681 /* [retval][out] */ BOOL* /*result*/)
686 HRESULT STDMETHODCALLTYPE DOMWheelEvent::shiftKey(
687 /* [retval][out] */ BOOL* /*result*/)
692 HRESULT STDMETHODCALLTYPE DOMWheelEvent::altKey(
693 /* [retval][out] */ BOOL* /*result*/)
698 HRESULT STDMETHODCALLTYPE DOMWheelEvent::metaKey(
699 /* [retval][out] */ BOOL* /*result*/)
704 HRESULT STDMETHODCALLTYPE DOMWheelEvent::wheelDelta(
705 /* [retval][out] */ long* /*result*/)
710 HRESULT STDMETHODCALLTYPE DOMWheelEvent::wheelDeltaX(
711 /* [retval][out] */ long* /*result*/)
716 HRESULT STDMETHODCALLTYPE DOMWheelEvent::wheelDeltaY(
717 /* [retval][out] */ long* /*result*/)
722 HRESULT STDMETHODCALLTYPE DOMWheelEvent::offsetX(
723 /* [retval][out] */ long* /*result*/)
728 HRESULT STDMETHODCALLTYPE DOMWheelEvent::offsetY(
729 /* [retval][out] */ long* /*result*/)
734 HRESULT STDMETHODCALLTYPE DOMWheelEvent::x(
735 /* [retval][out] */ long* /*result*/)
740 HRESULT STDMETHODCALLTYPE DOMWheelEvent::y(
741 /* [retval][out] */ long* /*result*/)
746 HRESULT STDMETHODCALLTYPE DOMWheelEvent::isHorizontal(
747 /* [retval][out] */ BOOL* /*result*/)
752 HRESULT STDMETHODCALLTYPE DOMWheelEvent::initWheelEvent(
753 /* [in] */ long /*wheelDeltaX*/,
754 /* [in] */ long /*wheelDeltaY*/,
755 /* [in] */ IDOMWindow* /*view*/,
756 /* [in] */ long /*screenX*/,
757 /* [in] */ long /*screenY*/,
758 /* [in] */ long /*clientX*/,
759 /* [in] */ long /*clientY*/,
760 /* [in] */ BOOL /*ctrlKey*/,
761 /* [in] */ BOOL /*altKey*/,
762 /* [in] */ BOOL /*shiftKey*/,
763 /* [in] */ BOOL /*metaKey*/)