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

List:       kde-commits
Subject:    KDE/kdelibs/khtml/rendering
From:       Germain Garand <germain () ebooksfrance ! org>
Date:       2010-01-18 4:21:35
Message-ID: 1263788495.176425.32709.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 1076384 by ggarand:

Don't use scrollToXOffset/scrollToYOffset during layout -
they might trigger a script through the firing of a scroll event.

Add isPerformingLayout method to RenderCanvas to ease debugging and
catching of in-layout conditions.


BUG: 201245

 M  +5 -0      render_canvas.cpp  
 M  +4 -0      render_canvas.h  
 M  +7 -11     render_layer.cpp  
 M  +3 -1      render_layer.h  


--- trunk/KDE/kdelibs/khtml/rendering/render_canvas.cpp #1076383:1076384
@@ -82,6 +82,8 @@
 
     m_needsWidgetMasks = false;
 
+    m_isPerformingLayout = false;
+
     // Create a new root layer for our layer hierarchy.
     m_layer = new (node->document()->renderArena()) RenderLayer(this);
 }
@@ -142,6 +144,8 @@
 
 void RenderCanvas::layout()
 {
+    m_isPerformingLayout = true;
+
     if (m_pagedMode) {
        m_minWidth = m_width;
 //        m_maxWidth = m_width;
@@ -201,6 +205,7 @@
     scheduleDeferredRepaints();
     setNeedsLayout(false);
 
+    m_isPerformingLayout = false;
 #ifdef SPEED_DEBUG
     kDebug() << "RenderCanvas::end time used=" << qt.elapsed();
 #endif
--- trunk/KDE/kdelibs/khtml/rendering/render_canvas.h #1076383:1076384
@@ -137,6 +137,8 @@
     void removeStaticObject( RenderObject*o, bool positioned=false );
 
     void updateDocSizeAfterLayerTranslation( RenderObject* o, bool posXOffset, bool \
posYOffset ); +
+    bool isPerformingLayout() const { return m_isPerformingLayout; }
 protected:
     // makes sure document, scrollbars and viewport size are accurate
     void updateDocumentSize();
@@ -177,6 +179,8 @@
     bool m_pagedMode;
     // Canvas contains overlaid widgets
     bool m_needsWidgetMasks;
+    // Wether we are currently performing a layout
+    bool m_isPerformingLayout;
 
     short m_pageNr;
 
--- trunk/KDE/kdelibs/khtml/rendering/render_layer.cpp #1076383:1076384
@@ -692,8 +692,9 @@
         y += sy;
 }
 
-void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repaint)
+void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repaint, \
bool dispatchEvent)  {
+    assert(!renderer()->canvas()->isPerformingLayout() || !dispatchEvent);
     if (renderer()->style()->overflowX() != OMARQUEE || \
!renderer()->hasOverflowClip()) {  if (x < 0) x = 0;
         if (y < 0) y = 0;
@@ -732,6 +733,9 @@
             m_vBar->setValue(m_scrollY);
     }
 
+    if (!dispatchEvent)
+        return;
+
     // Fire the scroll DOM event. Do this the very last thing, since the handler may \
                kill us.
     m_object->element()->dispatchHTMLEvent(EventImpl::SCROLL_EVENT, false, false);   \
  }
@@ -917,14 +921,14 @@
             if (m_hBar) 
                 m_hBar->setEnabled(true);
             else
-                scrollToXOffset(0);
+                resetXOffset();
         }
         if (m_object->style()->overflowY() == OAUTO) {
             showScrollbar(Qt::Vertical, needVerticalBar);
             if (m_vBar)
                 m_vBar->setEnabled(true);
             else
-                scrollToYOffset(0);
+                resetYOffset();
         }
 
         m_object->setNeedsLayout(true);
@@ -945,24 +949,16 @@
         if (pageStep < 0) pageStep = clientWidth;
         m_hBar->setSingleStep(LINE_STEP);
         m_hBar->setPageStep(pageStep);
-#ifdef APPLE_CHANGES
-        m_hBar->setKnobProportion(clientWidth, m_scrollWidth);
-#else
         m_hBar->setRange(0, needHorizontalBar ? m_scrollWidth-clientWidth : 0);
         if (hasReversedScrollbar())
             m_hBar->setValue( m_hBar->maximum() - m_scrollX );
-#endif
     }
     if (m_vBar) {
         int pageStep = (clientHeight-PAGE_KEEP);
         if (pageStep < 0) pageStep = clientHeight;
         m_vBar->setSingleStep(LINE_STEP);
         m_vBar->setPageStep(pageStep);
-#ifdef APPLE_CHANGES
-        m_vBar->setKnobProportion(clientHeight, m_scrollHeight);
-#else
         m_vBar->setRange(0, needVerticalBar ? m_scrollHeight-clientHeight : 0);
-#endif
     }
 }
 
--- trunk/KDE/kdelibs/khtml/rendering/render_layer.h #1076383:1076384
@@ -180,9 +180,11 @@
     void checkInlineRelOffset(const RenderObject* o, int& x, int& y);
     int scrollXOffset() { return m_scrollX + m_scrollXOrigin; }
     int scrollYOffset() { return m_scrollY; }
-    void scrollToOffset(int x, int y, bool updateScrollbars = true, bool repaint = \
true); +    void scrollToOffset(int x, int y, bool updateScrollbars = true, bool \
repaint = true, bool dispatchEvent = true);  void scrollToXOffset(int x) { \
                scrollToOffset(x, m_scrollY); }
     void scrollToYOffset(int y) { scrollToOffset(m_scrollX + m_scrollXOrigin, y); }
+    void resetXOffset() { scrollToOffset(0, m_scrollY, false, false, false); }
+    void resetYOffset() { scrollToOffset(m_scrollX + m_scrollXOrigin, 0, false, \
false, false); }  void showScrollbar(Qt::Orientation, bool);
     ScrollBarWidget* horizontalScrollbar() { return m_hBar; }
     ScrollBarWidget* verticalScrollbar() { return m_vBar; }


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

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