[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