143MouseEventDispatchMediator::MouseEventDispatchMediator(const AtomicString& eventType, PassRefPtr<AbstractView> view, const PlatformMouseEvent& event, int detail, PassRefPtr<Node> relatedTarget)
144 : EventDispatchMediator()
145{
146 ASSERT(event.eventType() == MouseEventMoved || event.button() != NoButton);
147
148 bool isCancelable = eventType != eventNames().mousemoveEvent;
149
150 setEvent(MouseEvent::create(eventType, true, isCancelable, view,
151 detail, event.globalX(), event.globalY(), event.x(), event.y(),
152 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(),
153 relatedTarget, 0, false));
154}
155
156MouseEvent* MouseEventDispatchMediator::event() const
157{
158 return static_cast<MouseEvent*>(EventDispatchMediator::event());
159}
160
161bool MouseEventDispatchMediator::dispatchEvent(EventDispatcher* dispatcher) const
162{
163 if (dispatcher->node()->disabled()) // Don't even send DOM events for disabled controls..
164 return true;
165
166 if (event()->type().isEmpty())
167 return false; // Shouldn't happen.
168
169 RefPtr<EventTarget> relatedTarget = dispatcher->adjustRelatedTarget(event()->relatedTarget());
170 event()->setRelatedTarget(relatedTarget);
171
172 dispatcher->dispatchEvent(event());
173 bool swallowEvent = event()->defaultHandled() || event()->defaultPrevented();
174
175 // Special case: If it's a double click event, we also send the dblclick event. This is not part
176 // of the DOM specs, but is used for compatibility with the ondblclick="" attribute. This is treated
177 // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
178 if (event()->type() == eventNames().clickEvent && event()->detail() == 2) {
179 RefPtr<MouseEvent> doubleClickEvent = MouseEvent::create();
180 doubleClickEvent->initMouseEvent(eventNames().dblclickEvent, event()->bubbles(), event()->cancelable(), event()->view(),
181 event()->detail(), event()->screenX(), event()->screenY(), event()->clientX(), event()->clientY(),
182 event()->ctrlKey(), event()->altKey(), event()->shiftKey(), event()->metaKey(),
183 event()->button(), relatedTarget);
184 if (event()->defaultHandled())
185 doubleClickEvent->setDefaultHandled();
186 dispatcher->dispatchEvent(doubleClickEvent);
187 if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented())
188 swallowEvent = true;
189 }
190
191 return swallowEvent;
192}
193