1 /* 2 * Copyright (C) 2010 Google Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 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. 12 * 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. 24 * 25 */ 26 27 #include "config.h" 28 #include "core/dom/EventContext.h" 29 30 #include "core/dom/Event.h" 31 #include "core/dom/FocusEvent.h" 32 #include "core/dom/MouseEvent.h" 33 #include "core/dom/Node.h" 34 #include "core/dom/StaticNodeList.h" 35 #include "core/dom/TouchEvent.h" 36 #include "core/dom/TouchList.h" 37 38 namespace WebCore { 39 40 EventContext::EventContext(PassRefPtr<Node> node, PassRefPtr<EventTarget> currentTarget, PassRefPtr<EventTarget> target) 41 : m_node(node) 42 , m_currentTarget(currentTarget) 43 , m_target(target) 44 { 45 ASSERT(m_node); 46 ASSERT(!isUnreachableNode(m_target.get())); 47 } 48 49 EventContext::~EventContext() 50 { 51 } 52 53 void EventContext::adoptEventPath(Vector<RefPtr<Node> >& nodes) 54 { 55 m_eventPath = StaticNodeList::adopt(nodes); 56 } 57 58 void EventContext::handleLocalEvents(Event* event) const 59 { 60 event->setTarget(m_target.get()); 61 event->setCurrentTarget(m_currentTarget.get()); 62 m_node->handleLocalEvents(event); 63 } 64 65 bool EventContext::isMouseOrFocusEventContext() const 66 { 67 return false; 68 } 69 70 bool EventContext::isTouchEventContext() const 71 { 72 return false; 73 } 74 75 MouseOrFocusEventContext::MouseOrFocusEventContext(PassRefPtr<Node> node, PassRefPtr<EventTarget> currentTarget, PassRefPtr<EventTarget> target) 76 : EventContext(node, currentTarget, target) 77 , m_relatedTarget(0) 78 { 79 } 80 81 MouseOrFocusEventContext::~MouseOrFocusEventContext() 82 { 83 } 84 85 void MouseOrFocusEventContext::handleLocalEvents(Event* event) const 86 { 87 ASSERT(event->isMouseEvent() || event->isFocusEvent()); 88 if (m_relatedTarget.get() && event->isMouseEvent()) 89 toMouseEvent(event)->setRelatedTarget(m_relatedTarget.get()); 90 else if (m_relatedTarget.get() && event->isFocusEvent()) 91 toFocusEvent(event)->setRelatedTarget(m_relatedTarget.get()); 92 EventContext::handleLocalEvents(event); 93 } 94 95 bool MouseOrFocusEventContext::isMouseOrFocusEventContext() const 96 { 97 return true; 98 } 99 100 TouchEventContext::TouchEventContext(PassRefPtr<Node> node, PassRefPtr<EventTarget> currentTarget, PassRefPtr<EventTarget> target) 101 : EventContext(node, currentTarget, target) 102 , m_touches(TouchList::create()) 103 , m_targetTouches(TouchList::create()) 104 , m_changedTouches(TouchList::create()) 105 { 106 } 107 108 TouchEventContext::~TouchEventContext() 109 { 110 } 111 112 void TouchEventContext::handleLocalEvents(Event* event) const 113 { 114 #ifndef NDEBUG 115 checkReachability(m_touches.get()); 116 checkReachability(m_targetTouches.get()); 117 checkReachability(m_changedTouches.get()); 118 #endif 119 ASSERT(event->isTouchEvent()); 120 TouchEvent* touchEvent = toTouchEvent(event); 121 touchEvent->setTouches(m_touches); 122 touchEvent->setTargetTouches(m_targetTouches); 123 touchEvent->setChangedTouches(m_changedTouches); 124 EventContext::handleLocalEvents(event); 125 } 126 127 bool TouchEventContext::isTouchEventContext() const 128 { 129 return true; 130 } 131 132 #ifndef NDEBUG 133 void TouchEventContext::checkReachability(TouchList* touchList) const 134 { 135 for (size_t i = 0; i < touchList->length(); ++i) 136 ASSERT(touchList->item(i)->target()->toNode()->treeScope()->isInclusiveAncestorOf(m_node->treeScope())); 137 } 138 #endif 139 140 } 141