[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/khtml
From:       Germain Garand <germain () ebooksfrance ! org>
Date:       2009-03-14 4:35:51
Message-ID: 1237005351.295975.15174.nullmailer () svn ! kde ! org
[Download RAW message or body]

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<QEvent::Type>(DOMCFResizeEvent)) );
+}
+
+void HTMLPartContainerElementImpl::sendPostedResizeEvents()
+{
+    QApplication::sendPostedEvents(0, DOMCFResizeEvent);
+}
+
+bool HTMLPartContainerElementImpl::event(QEvent *e)
+{
+    if (e->type() == static_cast<QEvent::Type>(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 )
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic