Reviewed by Adele.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Feb 2005 01:27:59 +0000 (01:27 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 23 Feb 2005 01:27:59 +0000 (01:27 +0000)
        - fixed <rdar://problem/4006596> REGRESSION (183-184): crash in DOM::DocumentImpl::setFocusNode(DOM::NodeImpl*)

        * khtml/xml/dom_docimpl.cpp:
        (widgetForNode): Added helper.
        (DocumentImpl::setFocusNode): Re-get the widget for the node after calling updateLayout.
        The updateLayout can destroy the old widget, so we can't keep a stale widget pointer around.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom_docimpl.cpp

index 822f0dcec18890ef183a4b0a4028d52d1bf908e3..0a01253891bceac0d8ef7b2a22cbfca31e55b182 100644 (file)
@@ -1,3 +1,14 @@
+2005-02-22  Darin Adler  <darin@apple.com>
+
+        Reviewed by Adele.
+
+        - fixed <rdar://problem/4006596> REGRESSION (183-184): crash in DOM::DocumentImpl::setFocusNode(DOM::NodeImpl*)
+
+        * khtml/xml/dom_docimpl.cpp:
+        (widgetForNode): Added helper.
+        (DocumentImpl::setFocusNode): Re-get the widget for the node after calling updateLayout.
+        The updateLayout can destroy the old widget, so we can't keep a stale widget pointer around.
+
 2005-02-22  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Hyatt
index 66336aa2c7fdf72c3d97354b960d4731a057a3b8..297993190be653cfc5ff5d5a8ac0b674006c8bef 100644 (file)
@@ -2445,6 +2445,14 @@ void DocumentImpl::setDashboardRegions (const QValueList<DashboardRegionValue>&
 
 #endif
 
+static QWidget *widgetForNode(NodeImpl *focusNode)
+{
+    RenderObject *renderer = focusNode->renderer();
+    if (!renderer || !renderer->isWidget())
+        return 0;
+    return static_cast<RenderWidget *>(renderer)->widget();
+}
+
 bool DocumentImpl::setFocusNode(NodeImpl *newFocusNode)
 {    
     // Make sure newFocusNode is actually in this document
@@ -2530,15 +2538,19 @@ bool DocumentImpl::setFocusNode(NodeImpl *newFocusNode)
         // eww, I suck. set the qt focus correctly
         // ### find a better place in the code for this
         if (getDocument()->view()) {
-            if (!m_focusNode->renderer() || !m_focusNode->renderer()->isWidget())
-                getDocument()->view()->setFocus();
-            else if (static_cast<RenderWidget*>(m_focusNode->renderer())->widget()) {
+            QWidget *focusWidget = widgetForNode(m_focusNode);
+            if (focusWidget) {
                 // Make sure a widget has the right size before giving it focus.
                 // Otherwise, we are testing edge cases of the QWidget code.
                 // Specifically, in WebCore this does not work well for text fields.
                 getDocument()->updateLayout();
-                static_cast<RenderWidget*>(m_focusNode->renderer())->widget()->setFocus();
+                // Re-get the widget in case updating the layout changed things.
+                focusWidget = widgetForNode(m_focusNode);
             }
+            if (focusWidget)
+                focusWidget->setFocus();
+            else
+                getDocument()->view()->setFocus();
         }
    }