From kde-commits Sat Mar 14 04:35:51 2009 From: Germain Garand Date: Sat, 14 Mar 2009 04:35:51 +0000 To: kde-commits Subject: KDE/kdelibs/khtml Message-Id: <1237005351.295975.15174.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=123700537527021 SVN commit 939174 by ggarand: queue DOM resize events sent to subframes until the toplevel frame has finished resizing. This avoids infinite recursion scenarios where javascript would run during the layout of the toplevel frame. Problem acurately diagnosed by SadEagle. BUG: 185790, 182027 M +20 -0 html/html_objectimpl.cpp M +7 -0 html/html_objectimpl.h M +11 -2 khtmlview.cpp --- trunk/KDE/kdelibs/khtml/html/html_objectimpl.cpp #939173:939174 @@ -134,6 +134,26 @@ dispatchHTMLEvent(EventImpl::LOAD_EVENT, false, false); } +void HTMLPartContainerElementImpl::postResizeEvent() +{ + QApplication::postEvent( this, new QEvent(static_cast(DOMCFResizeEvent)) ); +} + +void HTMLPartContainerElementImpl::sendPostedResizeEvents() +{ + QApplication::sendPostedEvents(0, DOMCFResizeEvent); +} + +bool HTMLPartContainerElementImpl::event(QEvent *e) +{ + if (e->type() == static_cast(DOMCFResizeEvent)) { + dispatchWindowEvent(EventImpl::RESIZE_EVENT, false, false); + e->accept(); + return true; + } + return QObject::event(e); +} + // ------------------------------------------------------------------------- HTMLObjectBaseElementImpl::HTMLObjectBaseElementImpl(DocumentImpl *doc) : HTMLPartContainerElementImpl(doc) --- trunk/KDE/kdelibs/khtml/html/html_objectimpl.h #939173:939174 @@ -46,6 +46,9 @@ { Q_OBJECT public: + + enum DOMChildFrameEvents { DOMCFResizeEvent = 0x3030 }; + HTMLPartContainerElementImpl(DocumentImpl *doc); ~HTMLPartContainerElementImpl(); @@ -70,11 +73,15 @@ // if KHTMLPart should not make a kpart for it, but rather let it be handled directly. virtual bool mimetypeHandledInternally(const QString& mime); + virtual bool event(QEvent *e); + // IMPORTANT: you should call this when requesting a URL, to make sure // that we don't get stale references to iframes or such. void clearChildWidget(); QWidget* childWidget() const { return m_childWidget; } + void postResizeEvent(); + static void sendPostedResizeEvents(); public slots: void slotEmitLoadEvent(); private: --- trunk/KDE/kdelibs/khtml/khtmlview.cpp #939173:939174 @@ -904,8 +904,17 @@ QApplication::sendPostedEvents(viewport(), QEvent::Paint); - if ( m_part && m_part->xmlDocImpl() ) - m_part->xmlDocImpl()->dispatchWindowEvent( EventImpl::RESIZE_EVENT, false, false ); + if ( m_part && m_part->xmlDocImpl() ) { + if (m_part->parentPart()) { + // sub-frame : queue the resize event until our toplevel is done layouting + khtml::ChildFrame *cf = m_part->parentPart()->frame( m_part ); + cf->m_partContainerElement->postResizeEvent(); + } else { + // toplevel : dispatch sub-frames'resize events before our own + HTMLPartContainerElementImpl::sendPostedResizeEvents(); + m_part->xmlDocImpl()->dispatchWindowEvent( EventImpl::RESIZE_EVENT, false, false ); + } + } } void KHTMLView::paintEvent( QPaintEvent *e )