* Fix fast/events/mousedown_in_scrollbar.html
authorzecke@webkit.org <zecke@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2007 05:50:15 +0000 (05:50 +0000)
committerzecke@webkit.org <zecke@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 30 Nov 2007 05:50:15 +0000 (05:50 +0000)
* This test used to crash in PlatformScrollbarQt::mouse*Event due parent() returning 0.
* Extend the current check that the scrollbar in the mev can be go away.
  This happens if we destroy a RenderLayer as the result of a click. In the
  case of Qt we can have this scrollbar in m_lastScrollbarUnderMouse. The RenderLayer
  is the ScrollbarClient, m_lastScrollbarUnderMouse is a RefPtr and keeps the
  last reference. When calling into this scrollbar the m_client pointer is a dangling pointer.
  We extend the check to set m_lastScrollbarUnderMouse back to zero when it was the
  scrollbar in the old mev and is gone in the new one.
* This happens only on the Qt port because we send more/different move events.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@28227 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/platform/qt/Skipped
WebCore/ChangeLog
WebCore/page/EventHandler.cpp

index abb28dc..86930c2 100644 (file)
@@ -1,3 +1,20 @@
+2007-11-29  Holger Hans Peter Freyther  <holger.freyther@trolltech.com>
+
+        Reviewed by Maciej.
+
+        * Fix fast/events/mousedown_in_scrollbar.html
+        * This test used to crash in PlatformScrollbarQt::mouse*Event due parent() returning 0.
+        * Extend the current check that the scrollbar in the mev can be go away.
+        This happens if we destroy a RenderLayer as the result of a click. In the
+        case of Qt we can have this scrollbar in m_lastScrollbarUnderMouse. The RenderLayer
+        is the ScrollbarClient, m_lastScrollbarUnderMouse is a RefPtr and keeps the
+        last reference. When calling into this scrollbar the m_client pointer is a dangling pointer.
+        We extend the check to set m_lastScrollbarUnderMouse back to zero when it was the
+        scrollbar in the old mev and is gone in the new one.
+        * This happens only on the Qt port because we send more/different move events.
+
+        * platform/qt/Skipped:
+
 2007-11-29  Antti Koivisto  <antti@apple.com>
 
         Reviewed by Mitz.
index 40a904f..7b3c65e 100644 (file)
@@ -6,7 +6,6 @@ editing/selection/5354455-2.html
 editing/selection/caret-and-focus-ring.html
 
 # -------- crashes
-fast/events/mousedown_in_scrollbar.html
 fast/events/objc-keyboard-event-creation.html
 
 # ------- failing editing tests
index 7c27d30..93c3363 100644 (file)
@@ -1,3 +1,21 @@
+2007-11-29  Holger Hans Peter Freyther  <holger.freyther@trolltech.com>
+
+        Reviewed by Maciej.
+
+        * Fix fast/events/mousedown_in_scrollbar.html
+        * This test used to crash in PlatformScrollbarQt::mouse*Event due parent() returning 0.
+        * Extend the current check that the scrollbar in the mev can be go away.
+        This happens if we destroy a RenderLayer as the result of a click. In the
+        case of Qt we can have this scrollbar in m_lastScrollbarUnderMouse. The RenderLayer
+        is the ScrollbarClient, m_lastScrollbarUnderMouse is a RefPtr and keeps the
+        last reference. When calling into this scrollbar the m_client pointer is a dangling pointer.
+        We extend the check to set m_lastScrollbarUnderMouse back to zero when it was the
+        scrollbar in the old mev and is gone in the new one.
+        * This happens only on the Qt port because we send more/different move events.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMousePressEvent):
+
 2007-11-29  Antti Koivisto  <antti@apple.com>
 
         Reviewed by Mitz.
index 38f6e2b..2eaafd5 100644 (file)
@@ -875,9 +875,14 @@ bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
 
     // If the hit testing originally determined the event was in a scrollbar, refetch the MouseEventWithHitTestResults
     // in case the scrollbar widget was destroyed when the mouse event was handled.
-    if (mev.scrollbar())
+    if (mev.scrollbar()) {
+        const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMouse.get();
         mev = prepareMouseEvent(HitTestRequest(true, true), mouseEvent);
 
+        if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get())
+            m_lastScrollbarUnderMouse = 0;
+    }
+
     if (swallowEvent) {
         // scrollbars should get events anyway, even disabled controls might be scrollable
         if (mev.scrollbar())