Changeset 82376 in webkit
- Timestamp:
- Mar 29, 2011 6:07:22 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r82366 r82376 1 2011-03-29 Dimitri Glazkov <dglazkov@chromium.org> 2 3 Reviewed by Darin Adler. 4 5 Introduce SimulatedMouseEvent and teach EventDispatcher how to use it. 6 https://bugs.webkit.org/show_bug.cgi?id=57402 7 8 No functional changes, covered by existing tests. 9 10 * dom/EventDispatcher.cpp: 11 (WebCore::EventDispatcher::dispatchSimulatedClick): Changed to use SimulatedMouseEvent. 12 (WebCore::EventDispatcher::dispatchMouseEvent): Combined two dispatchMouseEvent methods 13 into one, now that simulated-click events don't need one. 14 * dom/EventDispatcher.h: Updated decls. 15 * dom/MouseEvent.cpp: 16 (WebCore::SimulatedMouseEvent::create): Added. 17 (WebCore::SimulatedMouseEvent::~SimulatedMouseEvent): Added. 18 (WebCore::SimulatedMouseEvent::SimulatedMouseEvent): Added. 19 * dom/MouseEvent.h: Made constructor protected. 20 1 21 2011-03-29 Anders Carlsson <andersca@apple.com> 2 22 -
trunk/Source/WebCore/dom/EventDispatcher.cpp
r82264 r82376 100 100 } 101 101 102 bool EventDispatcher::dispatchMouseEvent(Node* node, const PlatformMouseEvent& event, const AtomicString& eventType, 103 int detail, Node* relatedTarget) 104 { 105 ASSERT(!eventDispatchForbidden()); 106 EventDispatcher dispatcher(node); 107 108 IntPoint contentsPos; 109 if (FrameView* view = node->document()->view()) 110 contentsPos = view->windowToContents(event.pos()); 111 112 short button = event.button(); 113 114 ASSERT(event.eventType() == MouseEventMoved || button != NoButton); 115 116 return dispatcher.dispatchMouseEvent(eventType, button, detail, 117 contentsPos.x(), contentsPos.y(), event.globalX(), event.globalY(), 118 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), 119 false, relatedTarget, 0); 120 } 121 122 void EventDispatcher::dispatchSimulatedClick(Node* node, PassRefPtr<Event> event, bool sendMouseEvents, bool showPressedLook) 102 void EventDispatcher::dispatchSimulatedClick(Node* node, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents, bool showPressedLook) 123 103 { 124 104 EventDispatcher dispatcher(node); … … 133 113 // send mousedown and mouseup before the click, if requested 134 114 if (sendMouseEvents) 135 dispatcher.dispatch SimulatedMouseEvent(eventNames().mousedownEvent, event.get());115 dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().mousedownEvent, node->document()->defaultView(), underlyingEvent)); 136 116 node->setActive(true, showPressedLook); 137 117 if (sendMouseEvents) 138 dispatcher.dispatch SimulatedMouseEvent(eventNames().mouseupEvent, event.get());118 dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().mouseupEvent, node->document()->defaultView(), underlyingEvent)); 139 119 node->setActive(false); 140 120 141 121 // always send click 142 dispatcher.dispatch SimulatedMouseEvent(eventNames().clickEvent, event);122 dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().clickEvent, node->document()->defaultView(), underlyingEvent)); 143 123 144 124 gNodesDispatchingSimulatedClicks->remove(node); … … 330 310 return !event->defaultPrevented(); 331 311 } 332 333 bool EventDispatcher::dispatchMouseEvent(const AtomicString& eventType, int button, int detail, 334 int pageX, int pageY, int screenX, int screenY, 335 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, 336 bool isSimulated, Node* relatedTargetArg, PassRefPtr<Event> underlyingEvent) 312 bool EventDispatcher::dispatchMouseEvent(Node* node, const PlatformMouseEvent& event, const AtomicString& eventType, 313 int detail, Node* relatedTargetArg) 337 314 { 338 315 ASSERT(!eventDispatchForbidden()); 339 if ( m_node->disabled()) // Don't even send DOM events for disabled controls..316 if (node->disabled()) // Don't even send DOM events for disabled controls.. 340 317 return true; 341 318 … … 343 320 return false; // Shouldn't happen. 344 321 322 EventDispatcher dispatcher(node); 323 324 IntPoint contentsPos; 325 if (FrameView* view = node->document()->view()) 326 contentsPos = view->windowToContents(event.pos()); 327 328 ASSERT(event.eventType() == MouseEventMoved || event.button() != NoButton); 329 330 // FIXME: This should be in mouse event constructor. 345 331 bool cancelable = eventType != eventNames().mousemoveEvent; 346 332 … … 350 336 RefPtr<Node> relatedTarget = pullOutOfShadow(relatedTargetArg); 351 337 352 int adjustedPageX = pageX;353 int adjustedPageY = pageY;354 if (Frame* frame = m_node->document()->frame()) {338 int adjustedPageX = contentsPos.x(); 339 int adjustedPageY = contentsPos.y(); 340 if (Frame* frame = node->document()->frame()) { 355 341 float pageZoom = frame->pageZoomFactor(); 356 342 if (pageZoom != 1.0f) { 357 343 // Adjust our pageX and pageY to account for the page zoom. 358 adjustedPageX = lroundf( pageX/ pageZoom);359 adjustedPageY = lroundf( pageY/ pageZoom);344 adjustedPageX = lroundf(contentsPos.x() / pageZoom); 345 adjustedPageY = lroundf(contentsPos.y() / pageZoom); 360 346 } 361 347 } 362 348 363 349 RefPtr<MouseEvent> mouseEvent = MouseEvent::create(eventType, 364 true, cancelable, m_node->document()->defaultView(),365 detail, screenX, screenY, adjustedPageX, adjustedPageY,366 ctrlKey, altKey, shiftKey, metaKey, button,367 relatedTarget, 0, isSimulated);368 mouseEvent->setUnderlyingEvent(underlyingEvent.get());369 mouseEvent->setAbsoluteLocation(IntPoint( pageX, pageY));370 371 dispatch Event(mouseEvent);350 true, cancelable, node->document()->defaultView(), 351 detail, event.globalX(), event.globalY(), adjustedPageX, adjustedPageY, 352 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(), 353 relatedTarget, 0, false); 354 // FIXME: Should this be adjustedPageX, adjustedPageY? 355 mouseEvent->setAbsoluteLocation(IntPoint(contentsPos.x(), contentsPos.y())); 356 357 dispatcher.dispatchEvent(mouseEvent); 372 358 bool defaultHandled = mouseEvent->defaultHandled(); 373 359 bool defaultPrevented = mouseEvent->defaultPrevented(); … … 380 366 if (eventType == eventNames().clickEvent && detail == 2) { 381 367 RefPtr<Event> doubleClickEvent = MouseEvent::create(eventNames().dblclickEvent, 382 true, cancelable, m_node->document()->defaultView(), 383 detail, screenX, screenY, adjustedPageX, adjustedPageY, 384 ctrlKey, altKey, shiftKey, metaKey, button, 385 relatedTarget, 0, isSimulated); 386 doubleClickEvent->setUnderlyingEvent(underlyingEvent.get()); 368 true, cancelable, node->document()->defaultView(), 369 detail, event.globalX(), event.globalY(), adjustedPageX, adjustedPageY, 370 event.ctrlKey(), event.altKey(), event.shiftKey(), event.metaKey(), event.button(), 371 relatedTarget, 0, false); 387 372 if (defaultHandled) 388 373 doubleClickEvent->setDefaultHandled(); 389 dispatch Event(doubleClickEvent);374 dispatcher.dispatchEvent(doubleClickEvent); 390 375 if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented()) 391 376 swallowEvent = true; … … 393 378 394 379 return swallowEvent; 395 }396 397 void EventDispatcher::dispatchSimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<Event> underlyingEvent)398 {399 ASSERT(!eventDispatchForbidden());400 401 bool ctrlKey = false;402 bool altKey = false;403 bool shiftKey = false;404 bool metaKey = false;405 if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEvent.get())) {406 ctrlKey = keyStateEvent->ctrlKey();407 altKey = keyStateEvent->altKey();408 shiftKey = keyStateEvent->shiftKey();409 metaKey = keyStateEvent->metaKey();410 }411 412 // Like Gecko, we just pass 0 for everything when we make a fake mouse event.413 // Internet Explorer instead gives the current mouse position and state.414 dispatchMouseEvent(eventType, 0, 0, 0, 0, 0, 0, ctrlKey, altKey, shiftKey, metaKey, true, 0, underlyingEvent);415 380 } 416 381 -
trunk/Source/WebCore/dom/EventDispatcher.h
r82264 r82376 52 52 53 53 static bool dispatchMouseEvent(Node*, const PlatformMouseEvent&, const AtomicString& eventType, int clickCount = 0, Node* relatedTarget = 0); 54 static void dispatchSimulatedClick(Node*, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents = false, bool showPressedLook = true);54 static void dispatchSimulatedClick(Node*, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents, bool showPressedLook); 55 55 static void dispatchWheelEvent(Node*, PlatformWheelEvent&); 56 56 … … 67 67 int pageX, int pageY, int screenX, int screenY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, 68 68 bool isSimulated, Node* relatedTargetArg, PassRefPtr<Event> underlyingEvent); 69 void dispatchSimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<Event> underlyingEvent);70 69 71 70 Vector<EventContext> m_ancestors; -
trunk/Source/WebCore/dom/MouseEvent.cpp
r40672 r82376 116 116 } 117 117 118 PassRefPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const AtomicString& eventType, PassRefPtr<AbstractView> view, PassRefPtr<Event> underlyingEvent) 119 { 120 return adoptRef(new SimulatedMouseEvent(eventType, view, underlyingEvent)); 121 } 122 123 SimulatedMouseEvent::~SimulatedMouseEvent() 124 { 125 } 126 127 SimulatedMouseEvent::SimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<AbstractView> view, PassRefPtr<Event> underlyingEvent) 128 : MouseEvent(eventType, true, true, view, 0, 0, 0, 0, 0, false, false, false, false, 0, 0, 0, true) 129 { 130 if (UIEventWithKeyState* keyStateEvent = findEventWithKeyState(underlyingEvent.get())) { 131 m_ctrlKey = keyStateEvent->ctrlKey(); 132 m_altKey = keyStateEvent->altKey(); 133 m_shiftKey = keyStateEvent->shiftKey(); 134 m_metaKey = keyStateEvent->metaKey(); 135 } 136 setUnderlyingEvent(underlyingEvent); 137 } 138 118 139 } // namespace WebCore -
trunk/Source/WebCore/dom/MouseEvent.h
r40672 r82376 45 45 ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, clipboard, isSimulated)); 46 46 } 47 static PassRefPtr<MouseEvent> createSimulated(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent); 48 47 49 virtual ~MouseEvent(); 48 50 … … 69 71 virtual int which() const; 70 72 71 private: 72 MouseEvent(); 73 protected: 73 74 MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>, 74 75 int detail, int screenX, int screenY, int pageX, int pageY, 75 76 bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button, 76 77 PassRefPtr<EventTarget> relatedTarget, PassRefPtr<Clipboard> clipboard, bool isSimulated); 78 79 private: 80 MouseEvent(); 77 81 78 82 unsigned short m_button; … … 82 86 }; 83 87 88 class SimulatedMouseEvent : public MouseEvent { 89 public: 90 static PassRefPtr<SimulatedMouseEvent> create(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent); 91 virtual ~SimulatedMouseEvent(); 92 93 private: 94 SimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent); 95 }; 96 84 97 } // namespace WebCore 85 98
Note: See TracChangeset
for help on using the changeset viewer.