Changeset 82376 in webkit


Ignore:
Timestamp:
Mar 29, 2011 6:07:22 PM (13 years ago)
Author:
Dimitri Glazkov
Message:

2011-03-29 Dimitri Glazkov <Dimitri Glazkov>

Reviewed by Darin Adler.

Introduce SimulatedMouseEvent and teach EventDispatcher how to use it.
https://bugs.webkit.org/show_bug.cgi?id=57402

No functional changes, covered by existing tests.

  • dom/EventDispatcher.cpp: (WebCore::EventDispatcher::dispatchSimulatedClick): Changed to use SimulatedMouseEvent. (WebCore::EventDispatcher::dispatchMouseEvent): Combined two dispatchMouseEvent methods

into one, now that simulated-click events don't need one.

  • dom/EventDispatcher.h: Updated decls.
  • dom/MouseEvent.cpp: (WebCore::SimulatedMouseEvent::create): Added. (WebCore::SimulatedMouseEvent::~SimulatedMouseEvent): Added. (WebCore::SimulatedMouseEvent::SimulatedMouseEvent): Added.
  • dom/MouseEvent.h: Made constructor protected.
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r82366 r82376  
     12011-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
    1212011-03-29  Anders Carlsson  <andersca@apple.com>
    222
  • trunk/Source/WebCore/dom/EventDispatcher.cpp

    r82264 r82376  
    100100}
    101101
    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)
     102void EventDispatcher::dispatchSimulatedClick(Node* node, PassRefPtr<Event> underlyingEvent, bool sendMouseEvents, bool showPressedLook)
    123103{
    124104    EventDispatcher dispatcher(node);
     
    133113    // send mousedown and mouseup before the click, if requested
    134114    if (sendMouseEvents)
    135         dispatcher.dispatchSimulatedMouseEvent(eventNames().mousedownEvent, event.get());
     115        dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().mousedownEvent, node->document()->defaultView(), underlyingEvent));
    136116    node->setActive(true, showPressedLook);
    137117    if (sendMouseEvents)
    138         dispatcher.dispatchSimulatedMouseEvent(eventNames().mouseupEvent, event.get());
     118        dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().mouseupEvent, node->document()->defaultView(), underlyingEvent));
    139119    node->setActive(false);
    140120
    141121    // always send click
    142     dispatcher.dispatchSimulatedMouseEvent(eventNames().clickEvent, event);
     122    dispatcher.dispatchEvent(SimulatedMouseEvent::create(eventNames().clickEvent, node->document()->defaultView(), underlyingEvent));
    143123
    144124    gNodesDispatchingSimulatedClicks->remove(node);
     
    330310    return !event->defaultPrevented();
    331311}
    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)
     312bool EventDispatcher::dispatchMouseEvent(Node* node, const PlatformMouseEvent& event, const AtomicString& eventType,
     313    int detail, Node* relatedTargetArg)
    337314{
    338315    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..
    340317        return true;
    341318
     
    343320        return false; // Shouldn't happen.
    344321
     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.
    345331    bool cancelable = eventType != eventNames().mousemoveEvent;
    346332
     
    350336    RefPtr<Node> relatedTarget = pullOutOfShadow(relatedTargetArg);
    351337
    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()) {
    355341        float pageZoom = frame->pageZoomFactor();
    356342        if (pageZoom != 1.0f) {
    357343            // 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);
    360346        }
    361347    }
    362348
    363349    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     dispatchEvent(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);
    372358    bool defaultHandled = mouseEvent->defaultHandled();
    373359    bool defaultPrevented = mouseEvent->defaultPrevented();
     
    380366    if (eventType == eventNames().clickEvent && detail == 2) {
    381367        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);
    387372        if (defaultHandled)
    388373            doubleClickEvent->setDefaultHandled();
    389         dispatchEvent(doubleClickEvent);
     374        dispatcher.dispatchEvent(doubleClickEvent);
    390375        if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented())
    391376            swallowEvent = true;
     
    393378
    394379    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);
    415380}
    416381
  • trunk/Source/WebCore/dom/EventDispatcher.h

    r82264 r82376  
    5252
    5353    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);
    5555    static void dispatchWheelEvent(Node*, PlatformWheelEvent&);
    5656
     
    6767        int pageX, int pageY, int screenX, int screenY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey,
    6868        bool isSimulated, Node* relatedTargetArg, PassRefPtr<Event> underlyingEvent);
    69     void dispatchSimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<Event> underlyingEvent);
    7069
    7170    Vector<EventContext> m_ancestors;
  • trunk/Source/WebCore/dom/MouseEvent.cpp

    r40672 r82376  
    116116}
    117117
     118PassRefPtr<SimulatedMouseEvent> SimulatedMouseEvent::create(const AtomicString& eventType, PassRefPtr<AbstractView> view, PassRefPtr<Event> underlyingEvent)
     119{
     120    return adoptRef(new SimulatedMouseEvent(eventType, view, underlyingEvent));
     121}
     122
     123SimulatedMouseEvent::~SimulatedMouseEvent()
     124{
     125}
     126
     127SimulatedMouseEvent::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
    118139} // namespace WebCore
  • trunk/Source/WebCore/dom/MouseEvent.h

    r40672 r82376  
    4545                ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget, clipboard, isSimulated));
    4646        }
     47        static PassRefPtr<MouseEvent> createSimulated(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent);
     48
    4749        virtual ~MouseEvent();
    4850
     
    6971        virtual int which() const;
    7072
    71     private:
    72         MouseEvent();
     73    protected:
    7374        MouseEvent(const AtomicString& type, bool canBubble, bool cancelable, PassRefPtr<AbstractView>,
    7475                   int detail, int screenX, int screenY, int pageX, int pageY,
    7576                   bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, unsigned short button,
    7677                   PassRefPtr<EventTarget> relatedTarget, PassRefPtr<Clipboard> clipboard, bool isSimulated);
     78
     79    private:
     80        MouseEvent();
    7781
    7882        unsigned short m_button;
     
    8286    };
    8387
     88class SimulatedMouseEvent : public MouseEvent {
     89public:
     90    static PassRefPtr<SimulatedMouseEvent> create(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent);
     91    virtual ~SimulatedMouseEvent();
     92
     93private:
     94    SimulatedMouseEvent(const AtomicString& eventType, PassRefPtr<AbstractView>, PassRefPtr<Event> underlyingEvent);
     95};
     96
    8497} // namespace WebCore
    8598
Note: See TracChangeset for help on using the changeset viewer.