[webkit-changes] cvs commit: WebCore/kwq KWQAccObject.mm KWQEvent.h KWQEvent.mm KWQWidget.mm

David hyatt at opensource.apple.com
Sat Sep 3 16:10:03 PDT 2005


hyatt       05/09/03 16:10:02

  Modified:    .        ChangeLog
               khtml    khtmlview.cpp
               khtml/ecma kjs_binding.cpp kjs_dom.cpp kjs_window.cpp
               khtml/html html_elementimpl.cpp html_formimpl.cpp
                        html_inlineimpl.cpp
               khtml/rendering render_form.cpp render_replaced.cpp
                        render_replaced.h
               khtml/xml EventNames.h dom_nodeimpl.cpp dom_nodeimpl.h
               kwq      KWQAccObject.mm KWQEvent.h KWQEvent.mm KWQWidget.mm
  Log:
  	This patch substantially reworks how mouse clicking and double clicking work in the DOM.
  
  	(1) screenY has been fixed so that it is no longer flipped.  This makes the values consistent with
  	other browsers on the Mac (like Firefox) and with Windows.
  
  	(2) For synthetic events delivered when the click() method is invoked, the values are simply set to 0
  	and false (e.g., for button, shiftKey, detail and so on).  This behavior matches Firefox.  WinIE uses
  	the current key and mouse state, but this just results in delivery of nonsense data, so we have opted
  	to match Firefox.
  
  	(3) onclick now exactly matches the DOM "click" event definition.  This means that onclick will now
  	fire on every single click (regardless of the click count), and onclick will now be considered the same
  	event as "click", meaning addEventListener "click"s and onclicks can interleave and work correctly during
  	the bubbling phase.  This behavior again deviates deliberately from WinIE and matches Firefox.  (In WinIE,
  	the onclick and ondblclick events are mutually exclusive, with click representing an odd clickCount and
  	dblclick representing an even clickCount).
  
  	(4) ondblclick has been changed to fire only when clickCount is exactly 2.  This matches Firefox.  dblclick
  	remains a separate synthetic event that fires independently of click with a clickCount of 2.  This also
  	matches Firefox behavior.
  
  	(5) mouseover and mouseout have been patched not to fire when they occur on a disabled control.  More generally, no
  	mouse event will be delivered to a disabled element.  The current check only examines the target node, and this
  	is not good enough (but can be improved in a later patch).  Some nodes will be children of disabled ancestors (e.g.,
  	options or children of a <button), and this is not yet taken into account.
  
  	(6) The behavior of shifting focus on a mousedown has been fixed to not occur if preventDefault has been set.  This
  	matches Firefox.
  
          Reviewed by darin
  
          * khtml/ecma/kjs_binding.cpp:
          (KJS::ScriptInterpreter::wasRunByUserGesture):
          * khtml/ecma/kjs_dom.cpp:
          (KJS::DOMNode::getValueProperty):
          (KJS::DOMNode::putValueProperty):
          * khtml/ecma/kjs_window.cpp:
          (KJS::Window::getValueProperty):
          (KJS::Window::put):
          * khtml/html/html_elementimpl.cpp:
          (HTMLElementImpl::parseMappedAttribute):
          (HTMLElementImpl::click):
          * khtml/html/html_formimpl.cpp:
          (DOM::HTMLInputElementImpl::defaultEventHandler):
          * khtml/html/html_inlineimpl.cpp:
          (DOM::HTMLAnchorElementImpl::defaultEventHandler):
          * khtml/khtmlview.cpp:
          (KHTMLViewPrivate::reset):
          (KHTMLView::viewportMousePressEvent):
          (KHTMLView::viewportMouseDoubleClickEvent):
          (KHTMLView::dispatchMouseEvent):
          * khtml/rendering/render_form.cpp:
          (RenderFormElement::slotClicked):
          * khtml/rendering/render_replaced.cpp:
          (RenderWidget::sendConsumedMouseUp):
          (RenderWidget::eventFilter):
          * khtml/rendering/render_replaced.h:
          * khtml/xml/EventNames.h:
          * khtml/xml/dom_nodeimpl.cpp:
          (DOM::NodeImpl::dispatchMouseEvent):
          (DOM::NodeImpl::dispatchSimulatedMouseEvent):
          * khtml/xml/dom_nodeimpl.h:
          * kwq/KWQAccObject.mm:
          (-[KWQAccObject mouseButtonListener]):
          * kwq/KWQEvent.h:
          (QMouseEvent::globalX):
          (QMouseEvent::globalY):
          (QMouseEvent::clickCount):
          * kwq/KWQEvent.mm:
          (positionForEvent):
          (globalPositionForEvent):
          (QMouseEvent::QMouseEvent):
          * kwq/KWQWidget.mm:
          (QWidget::sendConsumedMouseUp):
  
  Revision  Changes    Path
  1.83      +77 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.82
  retrieving revision 1.83
  diff -u -r1.82 -r1.83
  --- ChangeLog	3 Sep 2005 20:45:33 -0000	1.82
  +++ ChangeLog	3 Sep 2005 23:09:57 -0000	1.83
  @@ -1,3 +1,80 @@
  +2005-09-03  David Hyatt  <hyatt at apple.com>
  +
  +	This patch substantially reworks how mouse clicking and double clicking work in the DOM.
  +
  +	(1) screenY has been fixed so that it is no longer flipped.  This makes the values consistent with
  +	other browsers on the Mac (like Firefox) and with Windows.
  +
  +	(2) For synthetic events delivered when the click() method is invoked, the values are simply set to 0
  +	and false (e.g., for button, shiftKey, detail and so on).  This behavior matches Firefox.  WinIE uses
  +	the current key and mouse state, but this just results in delivery of nonsense data, so we have opted
  +	to match Firefox.
  +
  +	(3) onclick now exactly matches the DOM "click" event definition.  This means that onclick will now
  +	fire on every single click (regardless of the click count), and onclick will now be considered the same
  +	event as "click", meaning addEventListener "click"s and onclicks can interleave and work correctly during
  +	the bubbling phase.  This behavior again deviates deliberately from WinIE and matches Firefox.  (In WinIE,
  +	the onclick and ondblclick events are mutually exclusive, with click representing an odd clickCount and
  +	dblclick representing an even clickCount).
  +
  +	(4) ondblclick has been changed to fire only when clickCount is exactly 2.  This matches Firefox.  dblclick
  +	remains a separate synthetic event that fires independently of click with a clickCount of 2.  This also
  +	matches Firefox behavior.
  +
  +	(5) mouseover and mouseout have been patched not to fire when they occur on a disabled control.  More generally, no
  +	mouse event will be delivered to a disabled element.  The current check only examines the target node, and this
  +	is not good enough (but can be improved in a later patch).  Some nodes will be children of disabled ancestors (e.g.,
  +	options or children of a <button), and this is not yet taken into account.
  +
  +	(6) The behavior of shifting focus on a mousedown has been fixed to not occur if preventDefault has been set.  This
  +	matches Firefox.
  +
  +        Reviewed by darin
  +
  +        * khtml/ecma/kjs_binding.cpp:
  +        (KJS::ScriptInterpreter::wasRunByUserGesture):
  +        * khtml/ecma/kjs_dom.cpp:
  +        (KJS::DOMNode::getValueProperty):
  +        (KJS::DOMNode::putValueProperty):
  +        * khtml/ecma/kjs_window.cpp:
  +        (KJS::Window::getValueProperty):
  +        (KJS::Window::put):
  +        * khtml/html/html_elementimpl.cpp:
  +        (HTMLElementImpl::parseMappedAttribute):
  +        (HTMLElementImpl::click):
  +        * khtml/html/html_formimpl.cpp:
  +        (DOM::HTMLInputElementImpl::defaultEventHandler):
  +        * khtml/html/html_inlineimpl.cpp:
  +        (DOM::HTMLAnchorElementImpl::defaultEventHandler):
  +        * khtml/khtmlview.cpp:
  +        (KHTMLViewPrivate::reset):
  +        (KHTMLView::viewportMousePressEvent):
  +        (KHTMLView::viewportMouseDoubleClickEvent):
  +        (KHTMLView::dispatchMouseEvent):
  +        * khtml/rendering/render_form.cpp:
  +        (RenderFormElement::slotClicked):
  +        * khtml/rendering/render_replaced.cpp:
  +        (RenderWidget::sendConsumedMouseUp):
  +        (RenderWidget::eventFilter):
  +        * khtml/rendering/render_replaced.h:
  +        * khtml/xml/EventNames.h:
  +        * khtml/xml/dom_nodeimpl.cpp:
  +        (DOM::NodeImpl::dispatchMouseEvent):
  +        (DOM::NodeImpl::dispatchSimulatedMouseEvent):
  +        * khtml/xml/dom_nodeimpl.h:
  +        * kwq/KWQAccObject.mm:
  +        (-[KWQAccObject mouseButtonListener]):
  +        * kwq/KWQEvent.h:
  +        (QMouseEvent::globalX):
  +        (QMouseEvent::globalY):
  +        (QMouseEvent::clickCount):
  +        * kwq/KWQEvent.mm:
  +        (positionForEvent):
  +        (globalPositionForEvent):
  +        (QMouseEvent::QMouseEvent):
  +        * kwq/KWQWidget.mm:
  +        (QWidget::sendConsumedMouseUp):
  +
   2005-09-03  Darin Adler  <darin at apple.com>
   
           - fixed a mistake in the DOM tests, and an organizational issue that made them hard to
  
  
  
  1.144     +39 -139   WebCore/khtml/khtmlview.cpp
  
  Index: khtmlview.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/khtmlview.cpp,v
  retrieving revision 1.143
  retrieving revision 1.144
  diff -u -r1.143 -r1.144
  --- khtmlview.cpp	31 Aug 2005 04:38:35 -0000	1.143
  +++ khtmlview.cpp	3 Sep 2005 23:09:58 -0000	1.144
  @@ -179,7 +179,6 @@
           if (clickNode)
   	    clickNode->deref();
           clickNode = 0;
  -	isDoubleClick = false;
   	scrollingSelf = false;
   	layoutTimerId = 0;
           delayedLayout = false;
  @@ -223,7 +222,6 @@
   #endif
       int clickCount;
       NodeImpl *clickNode;
  -    bool isDoubleClick;
   
       int prevMouseX, prevMouseY;
       bool scrollingSelf;
  @@ -768,7 +766,6 @@
   
       //kdDebug( 6000 ) << "\nmousePressEvent: x=" << xm << ", y=" << ym << endl;
   
  -    d->isDoubleClick = false;
       d->mousePressed = true;
   
       DOM::NodeImpl::MouseEvent mev( _mouse->stateAfter(), DOM::NodeImpl::MousePress );
  @@ -830,7 +827,6 @@
   
       //kdDebug( 6000 ) << "mouseDblClickEvent: x=" << xm << ", y=" << ym << endl;
   
  -    d->isDoubleClick = true;
   #if APPLE_CHANGES
       // We get this instead of a second mouse-up 
       d->mousePressed = false;
  @@ -1807,148 +1803,52 @@
       if (d->underMouse)
   	d->underMouse->ref();
   
  -    int exceptioncode = 0;
  -    int clientX, clientY;
  -    viewportToContents(_mouse->x(), _mouse->y(), clientX, clientY);
  -#if APPLE_CHANGES
  -    QPoint screenLoc = viewportToGlobal(_mouse->pos());
  -    int screenX = screenLoc.x();
  -    int screenY = screenLoc.y();
  -#else
  -    int screenX = _mouse->globalX();
  -    int screenY = _mouse->globalY();
  -#endif
  -    int button = -1;
  -    switch (_mouse->button()) {
  -	case LeftButton:
  -	    button = 0;
  -	    break;
  -	case MidButton:
  -	    button = 1;
  -	    break;
  -	case RightButton:
  -	    button = 2;
  -	    break;
  -	default:
  -	    break;
  -    }
  -    bool ctrlKey = (_mouse->state() & ControlButton);
  -    bool altKey = (_mouse->state() & AltButton);
  -    bool shiftKey = (_mouse->state() & ShiftButton);
  -    bool metaKey = (_mouse->state() & MetaButton);
  -
       // mouseout/mouseover
  -    if (setUnder && (d->prevMouseX != clientX || d->prevMouseY != clientY)) {
  -
  -        // ### this code sucks. we should save the oldUnder instead of calculating
  -        // it again. calculating is expensive! (Dirk)
  -        NodeImpl *oldUnder = 0;
  -	if (d->prevMouseX >= 0 && d->prevMouseY >= 0) {
  -	    NodeImpl::MouseEvent mev( _mouse->stateAfter(), static_cast<NodeImpl::MouseEventType>(mouseEventType));
  -	    m_part->xmlDocImpl()->prepareMouseEvent( true, d->prevMouseX, d->prevMouseY, &mev );
  -	    oldUnder = mev.innerNode.get();
  -	}
  -	if (oldUnder != targetNode) {
  -	    // send mouseout event to the old node
  -	    if (oldUnder){
  -		oldUnder->ref();
  -		MouseEventImpl *me = new MouseEventImpl(mouseoutEvent,
  -							true,true,m_part->xmlDocImpl()->defaultView(),
  -							0,screenX,screenY,clientX,clientY,
  -							ctrlKey,altKey,shiftKey,metaKey,
  -							button,targetNode);
  -		oldUnder->dispatchEvent(me,exceptioncode,true);
  -	    }
  -
  -	    // send mouseover event to the new node
  -	    if (targetNode) {
  -		MouseEventImpl *me = new MouseEventImpl(mouseoverEvent,
  -							true,true,m_part->xmlDocImpl()->defaultView(),
  -							0,screenX,screenY,clientX,clientY,
  -							ctrlKey,altKey,shiftKey,metaKey,
  -							button,oldUnder);
  -		targetNode->dispatchEvent(me,exceptioncode,true);
  -	    }
  -
  -            if (oldUnder)
  -                oldUnder->deref();
  +    if (setUnder) {
  +        int clientX, clientY;
  +        viewportToContents(_mouse->x(), _mouse->y(), clientX, clientY);
  +        if (d->prevMouseX != clientX || d->prevMouseY != clientY) {
  +            // ### this code sucks. we should save the oldUnder instead of calculating
  +            // it again. calculating is expensive! (Dirk)
  +            // Also, there's no guarantee that the old under node is even around any more,
  +            // so we could be sending a mouseout to a node that never got a mouseover.
  +            SharedPtr<NodeImpl> oldUnder;
  +            if (d->prevMouseX >= 0 && d->prevMouseY >= 0) {
  +                NodeImpl::MouseEvent mev( _mouse->stateAfter(), static_cast<NodeImpl::MouseEventType>(mouseEventType));
  +                m_part->xmlDocImpl()->prepareMouseEvent( true, d->prevMouseX, d->prevMouseY, &mev );
  +                oldUnder = mev.innerNode;
  +            }
  +            if (oldUnder != targetNode) {
  +                // send mouseout event to the old node
  +                if (oldUnder)
  +                    oldUnder->dispatchMouseEvent(_mouse, mouseoutEvent);
  +                // send mouseover event to the new node
  +                if (targetNode)
  +                    targetNode->dispatchMouseEvent(_mouse, mouseoverEvent);
  +            }
           }
       }
   
       bool swallowEvent = false;
   
  -    if (targetNode) {
  -        // FIXME: Should share code with RenderFormElement::slotClicked, and NodeImpl::dispatchMouseEvent,
  -        // which do a lot of the same stuff.
  -
  -	// send the actual event
  -	MouseEventImpl *me = new MouseEventImpl(eventType,
  -						true,cancelable,m_part->xmlDocImpl()->defaultView(),
  -						detail,screenX,screenY,clientX,clientY,
  -						ctrlKey,altKey,shiftKey,metaKey,
  -						button,0);
  -	me->ref();
  -	targetNode->dispatchEvent(me,exceptioncode,true);
  -	bool defaultHandled = me->defaultHandled();
  -	bool defaultPrevented = me->defaultPrevented();
  -        if (me->defaultHandled() || me->defaultPrevented())
  -            swallowEvent = true;
  -	me->deref();
  -
  -	// Special case: If it's a click event, we also send the khtmlClickEvent or khtmlDblclickEvent. This is not part
  -	// of the DOM specs, but is used for compatibility with the traditional onclick="" and ondblclick="" attributes,
  -	// as there is no way to tell the difference between single & double clicks using DOM (only the click count is
  -	// stored, which is not necessarily the same).
  -	if (eventType == clickEvent) {
  -	    me = new MouseEventImpl(khtmlClickEvent,
  -				    true,cancelable,m_part->xmlDocImpl()->defaultView(),
  -				    detail,screenX,screenY,clientX,clientY,
  -				    ctrlKey,altKey,shiftKey,metaKey,
  -				    button,0);
  -	    me->ref();
  -	    if (defaultHandled)
  -		me->setDefaultHandled();
  -	    targetNode->dispatchEvent(me,exceptioncode,true);
  -            if (me->defaultHandled())
  -                defaultHandled = true;
  -            if (me->defaultPrevented())
  -                defaultPrevented = true;
  -            if (me->defaultHandled() || me->defaultPrevented())
  +    if (targetNode)
  +        swallowEvent = targetNode->dispatchMouseEvent(_mouse, eventType, detail);
  +    
  +    if (!swallowEvent && eventType == mousedownEvent) {
  +        // Focus should be shifted on mouse down, not on a click.  -dwh
  +        // Blur current focus node when a link/button is clicked; this
  +        // is expected by some sites that rely on onChange handlers running
  +        // from form fields before the button click is processed.
  +        DOM::NodeImpl* node = targetNode;
  +        for ( ; node && !node->isFocusable(); node = node->parentNode());
  +        // If focus shift is blocked, we eat the event.  Note we should never clear swallowEvent
  +        // if the page already set it (e.g., by canceling default behavior).
  +        if (node && node->isMouseFocusable()) {
  +            if (!m_part->xmlDocImpl()->setFocusNode(node))
                   swallowEvent = true;
  -	    me->deref();
  -
  -            if (d->isDoubleClick) {
  -                me = new MouseEventImpl(khtmlDblclickEvent,
  -                                        true,cancelable,m_part->xmlDocImpl()->defaultView(),
  -                                        detail,screenX,screenY,clientX,clientY,
  -                                        ctrlKey,altKey,shiftKey,metaKey,
  -                                        button,0);
  -                me->ref();
  -                if (defaultHandled)
  -                    me->setDefaultHandled();
  -                targetNode->dispatchEvent(me,exceptioncode,true);
  -                if (me->defaultHandled() || me->defaultPrevented())
  -                    swallowEvent = true;
  -                me->deref();
  -            }
  -
  -            // Also send a DOMActivate event, which causes things like form submissions to occur.
  -            if (!defaultPrevented && !targetNode->disabled())
  -                targetNode->dispatchUIEvent(DOMActivateEvent, detail);
  -        }
  -        else if (eventType == mousedownEvent) {
  -            // Focus should be shifted on mouse down, not on a click.  -dwh
  -            // Blur current focus node when a link/button is clicked; this
  -            // is expected by some sites that rely on onChange handlers running
  -            // from form fields before the button click is processed.
  -	    DOM::NodeImpl* nodeImpl = targetNode;
  -	    for ( ; nodeImpl && !nodeImpl->isFocusable(); nodeImpl = nodeImpl->parentNode());
  -            // If focus shift is blocked, we eat the event.  Note we should never clear swallowEvent
  -            // if the page already set it (e.g., by canceling default behavior).
  -            if (nodeImpl && nodeImpl->isMouseFocusable())
  -                swallowEvent |= !m_part->xmlDocImpl()->setFocusNode(nodeImpl);
  -            else if (!nodeImpl || !nodeImpl->focused())
  -                swallowEvent |= !m_part->xmlDocImpl()->setFocusNode(0);
  +        } else if (!node || !node->focused()) {
  +            if (!m_part->xmlDocImpl()->setFocusNode(0))
  +            swallowEvent = true;
           }
       }
   
  
  
  
  1.43      +0 -1      WebCore/khtml/ecma/kjs_binding.cpp
  
  Index: kjs_binding.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_binding.cpp,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- kjs_binding.cpp	31 Aug 2005 04:38:36 -0000	1.42
  +++ kjs_binding.cpp	3 Sep 2005 23:09:58 -0000	1.43
  @@ -189,7 +189,6 @@
       bool eventOk = ( // mouse events
         type == clickEvent || type == mousedownEvent ||
         type == mouseupEvent || type == khtmlDblclickEvent ||
  -      type == khtmlClickEvent ||
         // keyboard events
         type == keydownEvent || type == keypressEvent ||
         type == keyupEvent ||
  
  
  
  1.95      +2 -2      WebCore/khtml/ecma/kjs_dom.cpp
  
  Index: kjs_dom.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_dom.cpp,v
  retrieving revision 1.94
  retrieving revision 1.95
  diff -u -r1.94 -r1.95
  --- kjs_dom.cpp	31 Aug 2005 04:38:36 -0000	1.94
  +++ kjs_dom.cpp	3 Sep 2005 23:09:58 -0000	1.95
  @@ -318,7 +318,7 @@
     case OnChange:
       return getListener(changeEvent);
     case OnClick:
  -    return getListener(khtmlClickEvent);
  +    return getListener(clickEvent);
     case OnContextMenu:
       return getListener(contextmenuEvent);
     case OnDblClick:
  @@ -472,7 +472,7 @@
       setListener(exec,changeEvent,value);
       break;
     case OnClick:
  -    setListener(exec,khtmlClickEvent,value);
  +    setListener(exec,clickEvent,value);
       break;
     case OnContextMenu:
       setListener(exec,contextmenuEvent,value);
  
  
  
  1.177     +2 -2      WebCore/khtml/ecma/kjs_window.cpp
  
  Index: kjs_window.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_window.cpp,v
  retrieving revision 1.176
  retrieving revision 1.177
  diff -u -r1.176 -r1.177
  --- kjs_window.cpp	31 Aug 2005 04:38:36 -0000	1.176
  +++ kjs_window.cpp	3 Sep 2005 23:09:58 -0000	1.177
  @@ -895,7 +895,7 @@
      case Onchange:
        return getListener(exec, changeEvent);
      case Onclick:
  -     return getListener(exec, khtmlClickEvent);
  +     return getListener(exec, clickEvent);
      case Ondblclick:
        return getListener(exec, khtmlDblclickEvent);
      case Ondragdrop:
  @@ -1139,7 +1139,7 @@
         return;
       case Onclick:
         if (isSafeScript(exec))
  -        setListener(exec,khtmlClickEvent,value);
  +        setListener(exec,clickEvent,value);
         return;
       case Ondblclick:
         if (isSafeScript(exec))
  
  
  
  1.104     +4 -7      WebCore/khtml/html/html_elementimpl.cpp
  
  Index: html_elementimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/html/html_elementimpl.cpp,v
  retrieving revision 1.103
  retrieving revision 1.104
  diff -u -r1.103 -r1.104
  --- html_elementimpl.cpp	31 Aug 2005 15:36:12 -0000	1.103
  +++ html_elementimpl.cpp	3 Sep 2005 23:09:59 -0000	1.104
  @@ -156,7 +156,7 @@
       }
   // standard events
       else if (attr->name() == onclickAttr) {
  -        setHTMLEventListener(khtmlClickEvent,
  +        setHTMLEventListener(clickEvent,
                                getDocument()->createHTMLEventListener(attr->value().qstring(), this));
       } else if (attr->name() == oncontextmenuAttr) {
       	setHTMLEventListener(contextmenuEvent,
  @@ -569,12 +569,10 @@
   
       // send mousedown and mouseup before the click, if requested
       if (sendMouseEvents) {
  -        QMouseEvent pressEvt(QEvent::MouseButtonPress, QPoint(x,y), Qt::LeftButton, 0);
  -        dispatchMouseEvent(&pressEvt, mousedownEvent);
  +        dispatchSimulatedMouseEvent(mousedownEvent);
           if (r)
               setActive(true, showPressedLook);
  -        QMouseEvent upEvent(QEvent::MouseButtonRelease, QPoint(x,y), Qt::LeftButton, 0);
  -        dispatchMouseEvent(&upEvent, mouseupEvent);
  +        dispatchSimulatedMouseEvent(mouseupEvent);
           if (r)
               setActive(false);
       } else if (r) {
  @@ -583,8 +581,7 @@
       }
   
       // always send click
  -    QMouseEvent clickMouseEvent(QEvent::MouseButtonRelease, QPoint(x,y), Qt::LeftButton, 0);
  -    dispatchMouseEvent(&clickMouseEvent, clickEvent);
  +    dispatchSimulatedMouseEvent(clickEvent);
   }
   
   // accessKeyAction is used by the accessibility support code
  
  
  
  1.192     +1 -4      WebCore/khtml/html/html_formimpl.cpp
  
  Index: html_formimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/html/html_formimpl.cpp,v
  retrieving revision 1.191
  retrieving revision 1.192
  diff -u -r1.191 -r1.192
  --- html_formimpl.cpp	1 Sep 2005 17:40:12 -0000	1.191
  +++ html_formimpl.cpp	3 Sep 2005 23:09:59 -0000	1.192
  @@ -2287,10 +2287,7 @@
   
   void HTMLInputElementImpl::defaultEventHandler(EventImpl *evt)
   {
  -    if (evt->isMouseEvent() &&
  -        ( evt->type() == khtmlClickEvent || evt->type() == khtmlDblclickEvent ) &&
  -        m_type == IMAGE
  -        && m_render) {
  +    if (m_type == IMAGE && evt->isMouseEvent() && evt->type() == clickEvent && m_render) {
           // record the mouse position for when we get the DOMActivate event
           MouseEventImpl *me = static_cast<MouseEventImpl*>(evt);
           int offsetX, offsetY;
  
  
  
  1.50      +2 -2      WebCore/khtml/html/html_inlineimpl.cpp
  
  Index: html_inlineimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/html/html_inlineimpl.cpp,v
  retrieving revision 1.49
  retrieving revision 1.50
  diff -u -r1.49 -r1.50
  --- html_inlineimpl.cpp	31 Aug 2005 04:38:38 -0000	1.49
  +++ html_inlineimpl.cpp	3 Sep 2005 23:09:59 -0000	1.50
  @@ -118,10 +118,10 @@
       // React on clicks and on keypresses.
       // Don't make this KEYUP_EVENT again, it makes khtml follow links it shouldn't,
       // when pressing Enter in the combo.
  -    if ( ( evt->type() == khtmlClickEvent ||
  +    if ( ( evt->type() == clickEvent ||
            ( evt->type() == keydownEvent && m_focused)) && m_isLink) {
           MouseEventImpl *e = 0;
  -        if ( evt->type() == khtmlClickEvent )
  +        if ( evt->type() == clickEvent )
               e = static_cast<MouseEventImpl*>( evt );
   
           KeyboardEventImpl *k = 0;
  
  
  
  1.121     +0 -13     WebCore/khtml/rendering/render_form.cpp
  
  Index: render_form.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_form.cpp,v
  retrieving revision 1.120
  retrieving revision 1.121
  diff -u -r1.120 -r1.121
  --- render_form.cpp	2 Sep 2005 21:34:47 -0000	1.120
  +++ render_form.cpp	3 Sep 2005 23:10:00 -0000	1.121
  @@ -189,21 +189,8 @@
   
       RenderArena *arena = ref();
   
  -#if APPLE_CHANGES
       QMouseEvent event(QEvent::MouseButtonRelease); // gets "current event"
       element()->dispatchMouseEvent(&event, clickEvent, event.clickCount());
  -#else
  -    // We also send the KHTML_CLICK or KHTML_DBLCLICK event for
  -    // CLICK. This is not part of the DOM specs, but is used for
  -    // compatibility with the traditional onclick="" and ondblclick=""
  -    // attributes, as there is no way to tell the difference between
  -    // single & double clicks using DOM (only the click count is
  -    // stored, which is not necessarily the same)
  -
  -    QMouseEvent e2(QEvent::MouseButtonRelease, m_mousePos, m_button, m_state);
  -    element()->dispatchMouseEvent(&e2, clickEvent, m_clickCount);
  -    element()->dispatchMouseEvent(&e2, m_isDoubleClick ? khtmlDblclickEvent : khtmlClickEvent, m_clickCount);
  -#endif
   
       deref(arena);
   }
  
  
  
  1.84      +5 -51     WebCore/khtml/rendering/render_replaced.cpp
  
  Index: render_replaced.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_replaced.cpp,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -u -r1.83 -r1.84
  --- render_replaced.cpp	31 Aug 2005 04:38:40 -0000	1.83
  +++ render_replaced.cpp	3 Sep 2005 23:10:00 -0000	1.84
  @@ -354,12 +354,10 @@
   }
   
   #if APPLE_CHANGES
  -void RenderWidget::sendConsumedMouseUp(const QPoint &mousePos, int button, int state)
  +void RenderWidget::sendConsumedMouseUp()
   {
       RenderArena *arena = ref();
  -    QMouseEvent e( QEvent::MouseButtonRelease, mousePos, button, state);
  -
  -    element()->dispatchMouseEvent(&e, mouseupEvent, 0);
  +    element()->dispatchSimulatedMouseEvent(mouseupEvent);
       deref(arena);
   }
   #endif
  @@ -506,60 +504,16 @@
       case QEvent::FocusIn:
           //kdDebug(6000) << "RenderWidget::eventFilter captures FocusIn" << endl;
           elem->getDocument()->setFocusNode(elem);
  -//         if ( isEditable() ) {
  -//             KHTMLPartBrowserExtension *ext = static_cast<KHTMLPartBrowserExtension *>( elem->view->part()->browserExtension() );
  -//             if ( ext )  ext->editableWidgetFocused( m_widget );
  -//         }
           break;
       case QEvent::MouseButtonPress:
   //       handleMousePressed(static_cast<QMouseEvent*>(e));
           break;
       case QEvent::MouseButtonRelease:
  -//    {
  -//         int absX, absY;
  -//         absolutePosition(absX,absY);
  -//         QMouseEvent* _e = static_cast<QMouseEvent*>(e);
  -//         m_button = _e->button();
  -//         m_state  = _e->state();
  -//         QMouseEvent e2(e->type(),QPoint(absX,absY)+_e->pos(),_e->button(),_e->state());
  -
  -//         elem->dispatchMouseEvent(&e2,mouseupEvent,m_clickCount);
  -
  -//         if((m_mousePos - e2.pos()).manhattanLength() <= QApplication::startDragDistance()) {
  -//             // DOM2 Events section 1.6.2 says that a click is if the mouse was pressed
  -//             // and released in the "same screen location"
  -//             // As people usually can't click on the same pixel, we're a bit tolerant here
  -//             elem->dispatchMouseEvent(&e2,clickEvent,m_clickCount);
  -//         }
  -
  -//         if(!isRenderButton()) {
  -//             // ### DOMActivate is also dispatched for thigs like selects & textareas -
  -//             // not sure if this is correct
  -//             elem->dispatchUIEvent(DOMActivateEvent,m_isDoubleClick ? 2 : 1);
  -//             elem->dispatchMouseEvent(&e2, m_isDoubleClick ? khtmlDblclickEvent : khtmlClickEvent, m_clickCount);
  -//             m_isDoubleClick = false;
  -//         }
  -//         else
  -//             // save position for slotClicked - see below -
  -//             m_mousePos = e2.pos();
  -//     }
  -    break;
  +        break;
       case QEvent::MouseButtonDblClick:
  -//     {
  -//         m_isDoubleClick = true;
  -//         handleMousePressed(static_cast<QMouseEvent*>(e));
  -//     }
  -    break;
  +        break;
       case QEvent::MouseMove:
  -//     {
  -//         int absX, absY;
  -//         absolutePosition(absX,absY);
  -//         QMouseEvent* _e = static_cast<QMouseEvent*>(e);
  -//         QMouseEvent e2(e->type(),QPoint(absX,absY)+_e->pos(),_e->button(),_e->state());
  -//         elem->dispatchMouseEvent(&e2);
  -//         // ### change cursor like in KHTMLView?
  -//     }
  -    break;
  +        break;
       case QEvent::KeyPress:
       case QEvent::KeyRelease:
       {
  
  
  
  1.31      +1 -1      WebCore/khtml/rendering/render_replaced.h
  
  Index: render_replaced.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/rendering/render_replaced.h,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- render_replaced.h	14 Feb 2005 18:19:18 -0000	1.30
  +++ render_replaced.h	3 Sep 2005 23:10:00 -0000	1.31
  @@ -99,7 +99,7 @@
       virtual void setSelectionState(SelectionState s);
   
   #if APPLE_CHANGES 
  -    void sendConsumedMouseUp(const QPoint &mousePos, int button, int state);
  +    void sendConsumedMouseUp();
       virtual void updateWidgetPositions();
   #endif
   
  
  
  
  1.2       +0 -1      WebCore/khtml/xml/EventNames.h
  
  Index: EventNames.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/xml/EventNames.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- EventNames.h	31 Aug 2005 04:38:41 -0000	1.1
  +++ EventNames.h	3 Sep 2005 23:10:01 -0000	1.2
  @@ -82,7 +82,6 @@
       macro(DOMNodeRemovedFromDocument) \
       macro(DOMSubtreeModified) \
       \
  -    macro(khtmlClick) \
       macro(khtmlDblclick) \
       macro(khtmlDragdrop) \
       macro(khtmlError) \
  
  
  
  1.183     +37 -70    WebCore/khtml/xml/dom_nodeimpl.cpp
  
  Index: dom_nodeimpl.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/xml/dom_nodeimpl.cpp,v
  retrieving revision 1.182
  retrieving revision 1.183
  diff -u -r1.182 -r1.183
  --- dom_nodeimpl.cpp	31 Aug 2005 23:02:18 -0000	1.182
  +++ dom_nodeimpl.cpp	3 Sep 2005 23:10:01 -0000	1.183
  @@ -691,7 +691,6 @@
   
   bool NodeImpl::dispatchMouseEvent(QMouseEvent *_mouse, const AtomicString &overrideType, int overrideDetail)
   {
  -    bool cancelable = true;
       int detail = overrideDetail; // defaults to 0
       AtomicString eventType;
       if (!overrideType.isEmpty()) {
  @@ -706,57 +705,22 @@
                   break;
               case QEvent::MouseButtonDblClick:
                   eventType = clickEvent;
  -#if APPLE_CHANGES
                   detail = _mouse->clickCount();
  -#else
  -                detail = 1; // ### support for multiple double clicks
  -#endif
                   break;
               case QEvent::MouseMove:
                   eventType = mousemoveEvent;
  -                cancelable = false;
                   break;
               default:
                   break;
           }
       }
   
  -    if (eventType.isEmpty())
  -        return false; // shouldn't happen
  -
  -    int exceptioncode = 0;
  -
  -#if APPLE_CHANGES
  -// Careful here - our viewportToContents() converts points from NSEvents, in NSWindow coord system to
  -// our khtmlview's coord system.  This works for QMouseEvents coming from Cocoa because those events
  -// hold the location from the NSEvent.  The QMouseEvent param here was made by other khtml code, so it
  -// will be a "proper" QT event with coords in terms of this widget.  So in WebCore it would never be
  -// right to pass coords from _mouse to viewportToContents().
  -#endif
  -//    int clientX, clientY;
  -//    viewportToContents(_mouse->x(), _mouse->y(), clientX, clientY);
  -    int clientX = _mouse->x(); // ### adjust to be relative to view
  -    int clientY = _mouse->y(); // ### adjust to be relative to view
  -
  -#if APPLE_CHANGES
  -    int screenX;
  -    int screenY;
  -    KHTMLView *view = document->document()->view();
  -    if (view) {
  -        // This gets us as far as NSWindow coords
  -        QPoint windowLoc = view->contentsToViewport(_mouse->pos());
  -        // Then from NSWindow coords to screen coords
  -        QPoint screenLoc = view->viewportToGlobal(windowLoc);
  -        screenX = screenLoc.x();
  -        screenY = screenLoc.y();
  -    } else {
  -        screenX = _mouse->x();
  -        screenY = _mouse->y();
  -    }
  -#else
  +    int clientX = 0;
  +    int clientY = 0;
  +    if (KHTMLView *view = document->document()->view())
  +        view->viewportToContents(_mouse->x(), _mouse->y(), clientX, clientY);
       int screenX = _mouse->globalX();
       int screenY = _mouse->globalY();
  -#endif
   
       int button = -1;
       switch (_mouse->button()) {
  @@ -772,10 +736,37 @@
           default:
               break;
       }
  +
       bool ctrlKey = (_mouse->state() & Qt::ControlButton);
       bool altKey = (_mouse->state() & Qt::AltButton);
       bool shiftKey = (_mouse->state() & Qt::ShiftButton);
       bool metaKey = (_mouse->state() & Qt::MetaButton);
  +    
  +    return dispatchMouseEvent(eventType, button, detail,
  +        clientX, clientY, screenX, screenY,
  +        ctrlKey, altKey, shiftKey, metaKey);
  +}
  +
  +bool NodeImpl::dispatchSimulatedMouseEvent(const AtomicString &eventType)
  +{
  +    // Like Gecko, we just pass 0 for everything when we make a fake mouse event.
  +    // Internet Explorer instead gives the current mouse position and state.
  +    return dispatchMouseEvent(eventType, 0, 0, 0, 0, 0, 0, false, false, false, false);
  +}
  +
  +bool NodeImpl::dispatchMouseEvent(const AtomicString &eventType, int button, int detail,
  +    int clientX, int clientY, int screenX, int screenY,
  +    bool ctrlKey, bool altKey, bool shiftKey, bool metaKey)
  +{
  +    if (disabled()) // Don't even send DOM events for disabled controls..
  +        return true;
  +
  +    if (eventType.isEmpty())
  +        return false; // Shouldn't happen.
  +
  +    bool cancelable = eventType != mousemoveEvent;
  +    
  +    int exceptioncode = 0;
   
       bool swallowEvent = false;
   
  @@ -790,15 +781,11 @@
           swallowEvent = true;
       me->deref();
   
  -#if APPLE_CHANGES
  -    // Special case: If it's a click event, we also send the KHTML_CLICK or KHTML_DBLCLICK event. This is not part
  -    // of the DOM specs, but is used for compatibility with the traditional onclick="" and ondblclick="" attributes,
  -    // as there is no way to tell the difference between single & double clicks using DOM (only the click count is
  -    // stored, which is not necessarily the same)
  -    if (eventType == clickEvent) {
  -        eventType = khtmlClickEvent;
  -
  -        me = new MouseEventImpl(khtmlClickEvent,
  +    // Special case: If it's a double click event, we also send the KHTML_DBLCLICK event. This is not part
  +    // of the DOM specs, but is used for compatibility with the ondblclick="" attribute.  This is treated
  +    // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same.
  +    if (eventType == clickEvent && detail == 2) {
  +        me = new MouseEventImpl(khtmlDblclickEvent,
                                   true,cancelable,getDocument()->defaultView(),
                                   detail,screenX,screenY,clientX,clientY,
                                   ctrlKey,altKey,shiftKey,metaKey,
  @@ -807,33 +794,13 @@
           if (defaultHandled)
               me->setDefaultHandled();
           dispatchEvent(me,exceptioncode,true);
  -        if (me->defaultHandled())
  -            defaultHandled = true;
  -        if (me->defaultPrevented())
  -            defaultPrevented = true;
           if (me->defaultHandled() || me->defaultPrevented())
               swallowEvent = true;
           me->deref();
  -
  -        if (_mouse->isDoubleClick()) {
  -            me = new MouseEventImpl(khtmlDblclickEvent,
  -                                    true,cancelable,getDocument()->defaultView(),
  -                                    detail,screenX,screenY,clientX,clientY,
  -                                    ctrlKey,altKey,shiftKey,metaKey,
  -                                    button,0);
  -            me->ref();
  -            if (defaultHandled)
  -                me->setDefaultHandled();
  -            dispatchEvent(me,exceptioncode,true);
  -            if (me->defaultHandled() || me->defaultPrevented())
  -                swallowEvent = true;
  -            me->deref();
  -        }
       }
  -#endif
   
       // Also send a DOMActivate event, which causes things like form submissions to occur.
  -    if (eventType == khtmlClickEvent && !defaultPrevented && !disabled())
  +    if (eventType == clickEvent && !defaultPrevented)
           dispatchUIEvent(DOMActivateEvent, detail);
   
       return swallowEvent;
  
  
  
  1.100     +4 -1      WebCore/khtml/xml/dom_nodeimpl.h
  
  Index: dom_nodeimpl.h
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/xml/dom_nodeimpl.h,v
  retrieving revision 1.99
  retrieving revision 1.100
  diff -u -r1.99 -r1.100
  --- dom_nodeimpl.h	31 Aug 2005 04:38:41 -0000	1.99
  +++ dom_nodeimpl.h	3 Sep 2005 23:10:01 -0000	1.100
  @@ -278,8 +278,11 @@
       bool dispatchGenericEvent( EventImpl *evt, int &exceptioncode);
       bool dispatchHTMLEvent(const AtomicString &eventType, bool canBubbleArg, bool cancelableArg);
       bool dispatchWindowEvent(const AtomicString &eventType, bool canBubbleArg, bool cancelableArg);
  -    bool dispatchMouseEvent(QMouseEvent *e);
       bool dispatchMouseEvent(QMouseEvent *e, const AtomicString &overrideType, int overrideDetail = 0);
  +    bool dispatchSimulatedMouseEvent(const AtomicString &eventType);
  +    bool dispatchMouseEvent(const AtomicString &eventType, int button, int detail,
  +        int clientX, int clientY, int screenX, int screenY,
  +        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
       bool dispatchUIEvent(const AtomicString &eventType, int detail = 0);
       bool dispatchSubtreeModifiedEvent(bool childrenChanged = true);
       bool dispatchKeyEvent(QKeyEvent *key);
  
  
  
  1.80      +1 -1      WebCore/kwq/KWQAccObject.mm
  
  Index: KWQAccObject.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQAccObject.mm,v
  retrieving revision 1.79
  retrieving revision 1.80
  diff -u -r1.79 -r1.80
  --- KWQAccObject.mm	31 Aug 2005 04:38:43 -0000	1.79
  +++ KWQAccObject.mm	3 Sep 2005 23:10:01 -0000	1.80
  @@ -184,7 +184,7 @@
   {
       // FIXME: Do the continuation search like anchorElement does
       for (NodeImpl *elt = m_renderer->element(); elt; elt = elt->parentNode()) {
  -        if (elt->getHTMLEventListener(khtmlClickEvent) || elt->getHTMLEventListener(mousedownEvent) || elt->getHTMLEventListener(mouseupEvent))
  +        if (elt->getHTMLEventListener(clickEvent) || elt->getHTMLEventListener(mousedownEvent) || elt->getHTMLEventListener(mouseupEvent))
               return static_cast<ElementImpl*>(elt);
       }
       return NULL;
  
  
  
  1.37      +3 -4      WebCore/kwq/KWQEvent.h
  
  Index: KWQEvent.h
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQEvent.h,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- KWQEvent.h	26 Apr 2005 23:36:33 -0000	1.36
  +++ KWQEvent.h	3 Sep 2005 23:10:02 -0000	1.37
  @@ -72,26 +72,25 @@
   
   class QMouseEvent : public QEvent {
   public:
  -    QMouseEvent(Type, const QPoint &pos, int button, int state);
       QMouseEvent(Type, NSEvent *);
       explicit QMouseEvent(Type); // uses AppKit's current event
   
       const QPoint &pos() const { return _position; }
       int x() const { return _position.x(); }
       int y() const { return _position.y(); }
  -    int globalX() const { return _position.x(); } // we never really return global X
  -    int globalY() const { return _position.y(); } // we never really return global Y
  +    int globalX() const { return _globalPosition.x(); }
  +    int globalY() const { return _globalPosition.y(); }
       ButtonState button() const { return static_cast<ButtonState>(_button); }
       ButtonState state() const { return static_cast<ButtonState>(_state); }
       ButtonState stateAfter() const { return static_cast<ButtonState>(_stateAfter); }
   
       int clickCount() const { return _clickCount; }
  -    bool isDoubleClick() const { return _clickCount > 0 && _clickCount % 2 == 0; }
   
   private:
       void fixState();
   
       QPoint _position;
  +    QPoint _globalPosition;
       int _button;
       int _state;
       int _stateAfter;
  
  
  
  1.29      +10 -8     WebCore/kwq/KWQEvent.mm
  
  Index: KWQEvent.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQEvent.mm,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- KWQEvent.mm	26 Apr 2005 23:36:33 -0000	1.28
  +++ KWQEvent.mm	3 Sep 2005 23:10:02 -0000	1.29
  @@ -760,6 +760,9 @@
           case NSOtherMouseDragged:
           case NSMouseMoved:
           case NSScrollWheel:
  +            // Note: This has its origin at the bottom left of the window.
  +            // The Y coordinate gets flipped by QScrollView::viewportToContents.
  +            // We should probably change both this and that to not use "bottom left origin" coordinates at all.
               return QPoint([event locationInWindow]);
           default:
               return QPoint();
  @@ -779,8 +782,11 @@
           case NSOtherMouseUp:
           case NSOtherMouseDragged:
           case NSMouseMoved:
  -        case NSScrollWheel:
  -            return QPoint([[event window] convertBaseToScreen:[event locationInWindow]]);
  +        case NSScrollWheel: {
  +            NSPoint point = [[event window] convertBaseToScreen:[event locationInWindow]];
  +            point.y = NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]) - point.y;
  +            return QPoint(point);
  +        }
           default:
               return QPoint();
       }
  @@ -832,15 +838,10 @@
   
   // ======== 
   
  -QMouseEvent::QMouseEvent(Type type, const QPoint &position, int button, int state)
  -    : QEvent(type), _position(position), _button(button), _state(state), _clickCount(1)
  -{
  -    fixState();
  -}
  -
   QMouseEvent::QMouseEvent(Type type, NSEvent *event)
       : QEvent(type)
       , _position(positionForEvent(event))
  +    , _globalPosition(globalPositionForEvent(event))
       , _button(mouseButtonForEvent(event))
       , _state(nonMouseButtonsForEvent(event))
       , _clickCount(clickCountForEvent(event))
  @@ -854,6 +855,7 @@
       NSEvent *event = [NSApp currentEvent];
       if (event) {
           _position = positionForEvent(event);
  +        _globalPosition = globalPositionForEvent(event);
           _button = mouseButtonForEvent(event);
           _state = nonMouseButtonsForEvent(event);
           _clickCount = clickCountForEvent(event);
  
  
  
  1.110     +1 -3      WebCore/kwq/KWQWidget.mm
  
  Index: KWQWidget.mm
  ===================================================================
  RCS file: /cvs/root/WebCore/kwq/KWQWidget.mm,v
  retrieving revision 1.109
  retrieving revision 1.110
  diff -u -r1.109 -r1.110
  --- KWQWidget.mm	30 Aug 2005 09:30:25 -0000	1.109
  +++ KWQWidget.mm	3 Sep 2005 23:10:02 -0000	1.110
  @@ -540,9 +540,7 @@
   	(static_cast<const khtml::RenderWidget *>(eventFilterObject()));
   
       KWQ_BLOCK_EXCEPTIONS;
  -    widget->sendConsumedMouseUp(QPoint([[NSApp currentEvent] locationInWindow]),
  -			      // FIXME: should send real state and button
  -			      0, 0);
  +    widget->sendConsumedMouseUp();
       KWQ_UNBLOCK_EXCEPTIONS;
   }
   
  
  
  



More information about the webkit-changes mailing list