Summary: | Konqueror freezes at ifilm.com when cookies are disabled | ||
---|---|---|---|
Product: | [Applications] konqueror | Reporter: | Dima Ryazanov <dima> |
Component: | khtml | Assignee: | Konqueror Developers <konq-bugs> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | jlp, jquelin |
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Gentoo Packages | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: |
Description
Dima Ryazanov
2004-11-01 00:02:17 UTC
Gdb gave me following bt. 0x02bb4dba in DOM::NodeImpl::traverseNextNode (this=0x918b358, stayWithin=0x0) at dom_nodeimpl.cpp:701 701 while (n && !n->nextSibling() && (!stayWithin || n->parentNode() != stayWithin)) (gdb) bt #0 0x02bb4dba in DOM::NodeImpl::traverseNextNode (this=0x918b358, stayWithin=0x0) at dom_nodeimpl.cpp:701 #1 0x02ba893b in DOM::DocumentImpl::nextFocusNode (this=0x911bf38, fromNode=0x918af88) at dom_docimpl.cpp:1376 #2 0x02b3a1c5 in KHTMLView::focusNextPrevNode (this=0x926b030, next=true) at khtmlview.cpp:2049 #3 0x02b38cff in KHTMLView::focusNextPrevChild (this=0x926b030, next=true) at khtmlview.cpp:1710 #4 0x02b38e6f in KHTMLView::focusNextPrevChild (this=0x8e3d560, next=true) at khtmlview.cpp:1721 #5 0x0236c87d in QWidget::hide () from /usr/lib/qt-3.3/lib/libqt-mt.so.3 #6 0x02c54409 in ~RenderWidget (this=0x8ebe1f0) at render_replaced.cpp:131 #7 0x02c6ed0e in ~RenderPart (this=0x8ebe1f0) at render_frames.cpp:556 #8 0x02c6ee5e in ~RenderPartObject (this=0x8ebe1f0) at render_frames.cpp:142 #9 0x02c28951 in khtml::RenderObject::arenaDelete (this=0x8ebe218, arena=0x9278e58, base=0x8ebe1f0) at render_object.cpp:1533 #10 0x02c289bb in khtml::RenderObject::arenaDelete (this=0x8ebe218, arena=0x9278e58) at render_object.cpp:1546 #11 0x02c56dcd in khtml::RenderWidget::deref (this=0x8ebe1f0) at render_replaced.cpp:804 #12 0x02c542d4 in khtml::RenderWidget::detach (this=0x8ebe1f0) at render_replaced.cpp:123 #13 0x02bb53b2 in DOM::NodeImpl::detach (this=0x9222c18) *** Bug 120558 has been marked as a duplicate of this bug. *** *** Bug 122436 has been marked as a duplicate of this bug. *** Note: #122436 has a URL where this basic bug is still reproducible.. SVN commit 599857 by orlovich: Prevent crash-inducing recursion of detach due to blur events happening when widgets with focus get destroyed, by quietly shifting the focus to the view...(#135384, probably #124342 --- best I can tell given imperfect information); also affects some bugs which I separately closed as non-reproducible, but which involved such a sequence Also fixes freezing in #92497, as we no longer try to find something to focus when nothing is focusable.. BUG:92497 BUG:124342 BUG:135384 M +9 -0 khtmlview.cpp M +14 -3 xml/dom_docimpl.cpp --- branches/KDE/3.5/kdelibs/khtml/khtmlview.cpp #599856:599857 @@ -2031,6 +2031,15 @@ DocumentImpl *doc = m_part->xmlDocImpl(); NodeImpl *oldFocusNode = doc->focusNode(); + + // See whether we're in the middle of detach. If so, we want to + // clear focus... The document code will be careful to not + // emit events in that case.. + if (oldFocusNode && oldFocusNode->renderer() && + !oldFocusNode->renderer()->parent()) { + doc->setFocusNode(0); + return true; + } #if 1 // If the user has scrolled the document, then instead of picking --- branches/KDE/3.5/kdelibs/khtml/xml/dom_docimpl.cpp #599856:599857 @@ -2227,6 +2227,13 @@ { // don't process focus changes while detaching if( !m_render ) return; + + // We do want to blur if a widget is being detached, + // but we don't want to emit events since that + // triggers updateLayout() and may recurse detach() + bool widgetDetach = m_focusNode && m_focusNode != this && + m_focusNode->renderer() && !m_focusNode->renderer()->parent(); + // Make sure newFocusNode is actually in this document if (newFocusNode && (newFocusNode->getDocument() != this)) return; @@ -2241,8 +2248,11 @@ oldFocusNode->setActive(false); oldFocusNode->setFocus(false); - oldFocusNode->dispatchHTMLEvent(EventImpl::BLUR_EVENT,false,false); - oldFocusNode->dispatchUIEvent(EventImpl::DOMFOCUSOUT_EVENT); + + if (!widgetDetach) { + oldFocusNode->dispatchHTMLEvent(EventImpl::BLUR_EVENT,false,false); + oldFocusNode->dispatchUIEvent(EventImpl::DOMFOCUSOUT_EVENT); + } if ((oldFocusNode == this) && oldFocusNode->hasOneRef()) { oldFocusNode->deref(); // deletes this return; @@ -2278,7 +2288,8 @@ view()->setFocus(); } - updateRendering(); + if (!widgetDetach) + updateRendering(); } } |