[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

hyatt hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:31:00 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 3ac01352670c4e74eb9a4da8db2fe9c80bee6e46
Author: hyatt <hyatt at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Sat Mar 22 01:37:33 2003 +0000

    	Fixes for all 4 macromedia rendering problems.  They were all
    	related to buggy float handling.
    
    	The bugs are 3194998, 3195014, 3915155, 3204114.
    
    	This patch splits floats and positioned elements into two lists
    	instead of 1, and it also adds better logic for clearing out
    	floats when blocks move vertically.
    
            Reviewed by darin
    
            * khtml/rendering/bidi.cpp:
            * khtml/rendering/render_block.cpp:
            * khtml/rendering/render_block.h:
            * khtml/rendering/render_container.cpp:
            (RenderContainer::detach):
            * khtml/rendering/render_flow.cpp:
            (RenderFlow::addChildWithContinuation):
            * khtml/rendering/render_inline.cpp:
            (RenderInline::addChildToFlow):
            (RenderInline::nodeAtPoint):
            * khtml/rendering/render_object.cpp:
            (RenderObject::setStyle):
            (RenderObject::removeFromObjectLists):
            (RenderObject::nodeAtPoint):
            * khtml/rendering/render_object.h:
            * khtml/rendering/render_root.cpp:
            (RenderRoot::layout):
            * khtml/rendering/render_table.cpp:
            (RenderTable::layout):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@3897 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index 68e05c1..ee08334 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,36 @@
+2003-03-21  David Hyatt  <hyatt at apple.com>
+
+	Fixes for all 4 macromedia rendering problems.  They were all
+	related to buggy float handling.  
+
+	The bugs are 3194998, 3195014, 3915155, 3204114.
+
+	This patch splits floats and positioned elements into two lists
+	instead of 1, and it also adds better logic for clearing out
+	floats when blocks move vertically.
+	
+        Reviewed by darin
+
+        * khtml/rendering/bidi.cpp:
+        * khtml/rendering/render_block.cpp:
+        * khtml/rendering/render_block.h:
+        * khtml/rendering/render_container.cpp:
+        (RenderContainer::detach):
+        * khtml/rendering/render_flow.cpp:
+        (RenderFlow::addChildWithContinuation):
+        * khtml/rendering/render_inline.cpp:
+        (RenderInline::addChildToFlow):
+        (RenderInline::nodeAtPoint):
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::setStyle):
+        (RenderObject::removeFromObjectLists):
+        (RenderObject::nodeAtPoint):
+        * khtml/rendering/render_object.h:
+        * khtml/rendering/render_root.cpp:
+        (RenderRoot::layout):
+        * khtml/rendering/render_table.cpp:
+        (RenderTable::layout):
+
 2003-03-21  Darin Adler  <darin at apple.com>
 
         Reviewed by John.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index 68e05c1..ee08334 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,36 @@
+2003-03-21  David Hyatt  <hyatt at apple.com>
+
+	Fixes for all 4 macromedia rendering problems.  They were all
+	related to buggy float handling.  
+
+	The bugs are 3194998, 3195014, 3915155, 3204114.
+
+	This patch splits floats and positioned elements into two lists
+	instead of 1, and it also adds better logic for clearing out
+	floats when blocks move vertically.
+	
+        Reviewed by darin
+
+        * khtml/rendering/bidi.cpp:
+        * khtml/rendering/render_block.cpp:
+        * khtml/rendering/render_block.h:
+        * khtml/rendering/render_container.cpp:
+        (RenderContainer::detach):
+        * khtml/rendering/render_flow.cpp:
+        (RenderFlow::addChildWithContinuation):
+        * khtml/rendering/render_inline.cpp:
+        (RenderInline::addChildToFlow):
+        (RenderInline::nodeAtPoint):
+        * khtml/rendering/render_object.cpp:
+        (RenderObject::setStyle):
+        (RenderObject::removeFromObjectLists):
+        (RenderObject::nodeAtPoint):
+        * khtml/rendering/render_object.h:
+        * khtml/rendering/render_root.cpp:
+        (RenderRoot::layout):
+        * khtml/rendering/render_table.cpp:
+        (RenderTable::layout):
+
 2003-03-21  Darin Adler  <darin at apple.com>
 
         Reviewed by John.
diff --git a/WebCore/khtml/rendering/bidi.cpp b/WebCore/khtml/rendering/bidi.cpp
index c8c876a..b288377 100644
--- a/WebCore/khtml/rendering/bidi.cpp
+++ b/WebCore/khtml/rendering/bidi.cpp
@@ -433,7 +433,7 @@ static void addMidpoint(const BidiIterator& midpoint)
 
 static void appendRunsForObject(int start, int end, RenderObject* obj)
 {
-    if (start > end || obj->isSpecial())
+    if (start > end || obj->isFloatingOrPositioned())
         return;
 
     bool haveNextMidpoint = (smidpoints && sCurrMidpoint < sNumMidpoints);
@@ -1251,8 +1251,8 @@ void RenderBlock::layoutInlineChildren(bool relayoutChildren)
                     o->setLayouted(false);
                 if( !o->layouted() )
                     o->layout();
-                if(o->isPositioned())
-                    o->containingBlock()->insertSpecialObject(o);
+                if (o->isPositioned())
+                    o->containingBlock()->insertPositionedObject(o);
             }
             else if(o->isText()) // FIXME: Should be able to combine deleteLineBoxes/Runs
                 static_cast<RenderText *>(o)->deleteRuns();
@@ -1386,16 +1386,16 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start)
     // be skipped.
     while(!start.atEnd() && (start.obj->isInlineFlow() || (start.obj->style()->whiteSpace() != PRE &&
 #ifndef QT_NO_UNICODETABLES
-          ( start.direction() == QChar::DirWS || start.obj->isSpecial())
+          ( start.direction() == QChar::DirWS || start.obj->isFloatingOrPositioned())
 #else
-          ( start.current() == ' ' || start.obj->isSpecial())
+          ( start.current() == ' ' || start.obj->isFloatingOrPositioned())
 #endif
           ))) {
-        if( start.obj->isSpecial() ) {
+        if( start.obj->isFloatingOrPositioned() ) {
             RenderObject *o = start.obj;
             // add to special objects...
             if(o->isFloating()) {
-                insertSpecialObject(o);
+                insertFloatingObject(o);
                 // check if it fits in the current line.
                 // If it does, position it now, otherwise, position
                 // it after moving to next line (in newLine() func)
@@ -1403,9 +1403,9 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start)
                     positionNewFloats();
                     width = lineWidth(m_height);
                 }
-            } else if(o->isPositioned()) {
-                o->containingBlock()->insertSpecialObject(o);
             }
+            else if (o->isPositioned())
+                o->containingBlock()->insertPositionedObject(o);
         }
         
         adjustEmbeddding = true;
@@ -1467,10 +1467,10 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start)
             }
             goto end;
         }
-        if( o->isSpecial() ) {
+        if( o->isFloatingOrPositioned() ) {
             // add to special objects...
             if(o->isFloating()) {
-                insertSpecialObject(o);
+                insertFloatingObject(o);
                 // check if it fits in the current line.
                 // If it does, position it now, otherwise, position
                 // it after moving to next line (in newLine() func)
@@ -1478,9 +1478,9 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start)
                     positionNewFloats();
                     width = lineWidth(m_height);
                 }
-            } else if(o->isPositioned()) {
-                o->containingBlock()->insertSpecialObject(o);
             }
+            else if (o->isPositioned())
+                o->containingBlock()->insertPositionedObject(o);
         } else if (o->isInlineFlow()) {
             // Only empty inlines matter.  We treat those similarly to replaced elements.
             KHTMLAssert(!o->firstChild());
@@ -1740,7 +1740,7 @@ BidiIterator RenderBlock::findNextLineBreak(BidiIterator &start)
         last = o;
         o = next;
 
-        if (!last->isSpecial() && last->isReplaced() && last->style()->whiteSpace() != NOWRAP) {
+        if (!last->isFloatingOrPositioned() && last->isReplaced() && last->style()->whiteSpace() != NOWRAP) {
             // Go ahead and add in tmpW.
             w += tmpW;
             tmpW = 0;
diff --git a/WebCore/khtml/rendering/render_block.cpp b/WebCore/khtml/rendering/render_block.cpp
index 315b756..f8d9962 100644
--- a/WebCore/khtml/rendering/render_block.cpp
+++ b/WebCore/khtml/rendering/render_block.cpp
@@ -45,7 +45,8 @@ RenderBlock::RenderBlock(DOM::NodeImpl* node)
 :RenderFlow(node)
 {
     m_childrenInline = true;
-    m_specialObjects = 0;
+    m_floatingObjects = 0;
+    m_positionedObjects = 0;
     m_pre = false;
     m_firstLine = false;
     m_clearStatus = CNONE;
@@ -57,7 +58,8 @@ RenderBlock::RenderBlock(DOM::NodeImpl* node)
 
 RenderBlock::~RenderBlock()
 {
-    delete m_specialObjects;
+    delete m_floatingObjects;
+    delete m_positionedObjects;
 }
 
 void RenderBlock::setStyle(RenderStyle* _style)
@@ -172,7 +174,7 @@ void RenderBlock::addChildToFlow(RenderObject* newChild, RenderObject* beforeChi
     // A block has to either have all of its children inline, or all of its children as blocks.
     // So, if our children are currently inline and a block child has to be inserted, we move all our
     // inline children into anonymous block boxes
-    if ( m_childrenInline && !newChild->isInline() && !newChild->isSpecial() )
+    if ( m_childrenInline && !newChild->isInline() && !newChild->isFloatingOrPositioned() )
     {
         // This is a block with inline content. Wrap the inline content in anonymous blocks.
         makeChildrenNonInline(beforeChild);
@@ -184,7 +186,7 @@ void RenderBlock::addChildToFlow(RenderObject* newChild, RenderObject* beforeChi
             KHTMLAssert(beforeChild->parent() == this);
         }
     }
-    else if (!m_childrenInline && !newChild->isSpecial())
+    else if (!m_childrenInline && !newChild->isFloatingOrPositioned())
     {
         // If we're inserting an inline child but all of our children are blocks, then we have to make sure
         // it is put into an anomyous block box. We try to use an existing anonymous box if possible, otherwise
@@ -406,7 +408,7 @@ void RenderBlock::layout()
     if ( isTableCell() )
         relayoutChildren = true;
 
-    //     kdDebug( 6040 ) << specialObjects << "," << oldWidth << ","
+    //     kdDebug( 6040 ) << floatingObjects << "," << oldWidth << ","
     //                     << m_width << ","<< layouted() << "," << isAnonymousBox() << ","
     //                     << overhangingContents() << "," << isPositioned() << endl;
 
@@ -487,7 +489,7 @@ void RenderBlock::layout()
         m_height += borderBottom() + paddingBottom();
     }
 
-    layoutSpecialObjects( relayoutChildren );
+    layoutPositionedObjects( relayoutChildren );
 
     //kdDebug() << renderName() << " layout width=" << m_width << " height=" << m_height << endl;
 
@@ -616,9 +618,7 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
 
         if (child->isPositioned())
         {
-            static_cast<RenderBlock*>(child->containingBlock())->insertSpecialObject(child);
-            //kdDebug() << "RenderBlock::layoutBlockChildren inserting positioned into " << child->containingBlock()->renderName() << endl;
-
+            child->containingBlock()->insertPositionedObject(child);
             child = child->nextSibling();
             continue;
         } else if ( child->isReplaced() ) {
@@ -627,7 +627,7 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
         }
 
         if ( child->isFloating() ) {
-            insertSpecialObject( child );
+            insertFloatingObject( child );
 
             // The float should be positioned taking into account the bottom margin
             // of the previous flow.  We add that margin into the height, get the
@@ -653,7 +653,7 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
             // Get the next non-positioned/non-floating RenderBlock.
             RenderObject* next = child->nextSibling();
             RenderObject* curr = next;
-            while (curr && curr->isSpecial())
+            while (curr && curr->isFloatingOrPositioned())
                 curr = curr->nextSibling();
             if (curr && curr->isRenderBlock() && !curr->isAnonymousBox() &&
                 !curr->isCompact() && !curr->isRunIn()) {
@@ -696,7 +696,7 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
         if (child->isRunIn() && (child->childrenInline() || child->isReplaced())) {
             // Get the next non-positioned/non-floating RenderBlock.
             RenderObject* curr = child->nextSibling();
-            while (curr && curr->isSpecial())
+            while (curr && curr->isFloatingOrPositioned())
                 curr = curr->nextSibling();
             if (curr && (curr->isRenderBlock() && !curr->isAnonymousBox() && curr->childrenInline() &&
                          !curr->isCompact() && !curr->isRunIn())) {
@@ -844,12 +844,13 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
             }
 
             child->setPos(child->xPos(), ypos);
-            if (ypos != yPosEstimate && (child->containsSpecial() || containsSpecial())) {
+            if (ypos != yPosEstimate && (child->containsFloats() || containsFloats())) {
                 // Our guess was wrong. Make the child lay itself out again.
                 // XXXdwh some debugging code for this.
                 // printf("WE WERE WRONG for object %d (%d, %d)!\n", (int)child, yPosEstimate, ypos);
-                child->setLayouted(false);
-                child->layout();
+                child->markAllDescendantsWithFloatsForLayout();
+                if (!child->layouted())
+                    child->layout();
             }
         }
 
@@ -872,8 +873,9 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
             // If our value of clear caused us to be repositioned vertically to be
             // underneath a float, we have to do another layout to take into account
             // the extra space we now have available.
-            child->setLayouted(false);
-            child->layout();
+            child->markAllDescendantsWithFloatsForLayout();
+            if (!child->layouted())
+                child->layout();
         }
 
         // Reset the top margin contributor to false if we encountered
@@ -1005,22 +1007,19 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
     // kdDebug( 6040 ) << "layouted = " << layouted_ << endl;
 }
 
-void RenderBlock::layoutSpecialObjects( bool relayoutChildren )
+void RenderBlock::layoutPositionedObjects(bool relayoutChildren)
 {
-    if (m_specialObjects) {
-        //kdDebug( 6040 ) << renderName() << " " << this << "::layoutSpecialObjects() start" << endl;
-        SpecialObject* r;
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    if (m_positionedObjects) {
+        //kdDebug( 6040 ) << renderName() << " " << this << "::layoutPositionedObjects() start" << endl;
+        RenderObject* r;
+        QPtrListIterator<RenderObject> it(*m_positionedObjects);
         for ( ; (r = it.current()); ++it ) {
             //kdDebug(6040) << "   have a positioned object" << endl;
-            if (r->type == SpecialObject::Positioned) {
-                if ( relayoutChildren )
-                    r->node->setLayouted( false );
-                if ( !r->node->layouted() )
-                    r->node->layout();
-            }
+            if ( relayoutChildren )
+                r->setLayouted( false );
+            if ( !r->layouted() )
+                r->layout();
         }
-        m_specialObjects->sort();
     }
 }
 
@@ -1034,7 +1033,7 @@ void RenderBlock::paint(QPainter* p, int _x, int _y, int _w, int _h, int _tx, in
     {
         int h = m_overflowHeight;
         int yPos = _ty;
-        if (m_specialObjects && floatBottom() > h)
+        if (m_floatingObjects && floatBottom() > h)
             h = floatBottom();
 
         // Sanity check the first line
@@ -1100,11 +1099,11 @@ void RenderBlock::paintObject(QPainter *p, int _x, int _y,
 void RenderBlock::paintFloats(QPainter *p, int _x, int _y,
                               int _w, int _h, int _tx, int _ty, bool paintSelection)
 {
-    if (!m_specialObjects)
+    if (!m_floatingObjects)
         return;
 
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it) {
         // Only paint the object if our noPaint flag isn't set.
         if (r->node->isFloating() && !r->noPaint) {
@@ -1132,65 +1131,93 @@ void RenderBlock::paintFloats(QPainter *p, int _x, int _y,
     }
 }
 
-void RenderBlock::insertSpecialObject(RenderObject *o)
+void RenderBlock::insertPositionedObject(RenderObject *o)
 {
     // Create the list of special objects if we don't aleady have one
-    if (!m_specialObjects) {
-        m_specialObjects = new QSortedList<SpecialObject>;
-        m_specialObjects->setAutoDelete(true);
+    if (!m_positionedObjects) {
+        m_positionedObjects = new QPtrList<RenderObject>;
+        m_positionedObjects->setAutoDelete(false);
     }
     else {
         // Don't insert the object again if it's already in the list
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
-        SpecialObject* f;
+        QPtrListIterator<RenderObject> it(*m_positionedObjects);
+        RenderObject* f;
         while ( (f = it.current()) ) {
-            if (f->node == o) return;
+            if (f == o) return;
             ++it;
         }
     }
 
     // Create the special object entry & append it to the list
+    setOverhangingContents();
+    m_positionedObjects->append(o);
+}
 
-    SpecialObject *newObj;
-    if (o->isPositioned()) {
-        // positioned object
-        newObj = new SpecialObject(SpecialObject::Positioned);
-        setOverhangingContents();
+void RenderBlock::removePositionedObject(RenderObject *o)
+{
+    if (m_positionedObjects) {
+        QPtrListIterator<RenderObject> it(*m_positionedObjects);
+        while (it.current()) {
+            if (it.current() == o)
+                m_positionedObjects->removeRef(it.current());
+            ++it;
+        }
     }
-    else if (o->isFloating()) {
+}
+
+void RenderBlock::insertFloatingObject(RenderObject *o)
+{
+    // Create the list of special objects if we don't aleady have one
+    if (!m_floatingObjects) {
+        m_floatingObjects = new QPtrList<FloatingObject>;
+        m_floatingObjects->setAutoDelete(true);
+    }
+    else {
+        // Don't insert the object again if it's already in the list
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
+        FloatingObject* f;
+        while ( (f = it.current()) ) {
+            if (f->node == o) return;
+            ++it;
+        }
+    }
+
+    // Create the special object entry & append it to the list
+
+    FloatingObject *newObj;
+    if (o->isFloating()) {
         // floating object
         if ( !o->layouted() )
             o->layout();
 
         if(o->style()->floating() == FLEFT)
-            newObj = new SpecialObject(SpecialObject::FloatLeft);
+            newObj = new FloatingObject(FloatingObject::FloatLeft);
         else
-            newObj = new SpecialObject(SpecialObject::FloatRight);
+            newObj = new FloatingObject(FloatingObject::FloatRight);
 
         newObj->startY = -1;
         newObj->endY = -1;
         newObj->width = o->width() + o->marginLeft() + o->marginRight();
     }
     else {
-        // We should never get here, as insertSpecialObject() should only ever be called with positioned or floating
+        // We should never get here, as insertFloatingObject() should only ever be called with floating
         // objects.
         KHTMLAssert(false);
         newObj = 0; // keep gcc's uninitialized variable warnings happy
     }
 
-    newObj->count = m_specialObjects->count();
     newObj->node = o;
 
-    m_specialObjects->append(newObj);
+    m_floatingObjects->append(newObj);
 }
 
-void RenderBlock::removeSpecialObject(RenderObject *o)
+void RenderBlock::removeFloatingObject(RenderObject *o)
 {
-    if (m_specialObjects) {
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    if (m_floatingObjects) {
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
         while (it.current()) {
             if (it.current()->node == o)
-                m_specialObjects->removeRef(it.current());
+                m_floatingObjects->removeRef(it.current());
             ++it;
         }
     }
@@ -1198,15 +1225,15 @@ void RenderBlock::removeSpecialObject(RenderObject *o)
 
 void RenderBlock::positionNewFloats()
 {
-    if(!m_specialObjects) return;
-    SpecialObject *f = m_specialObjects->getLast();
+    if(!m_floatingObjects) return;
+    FloatingObject *f = m_floatingObjects->getLast();
     if(!f || f->startY != -1) return;
-    SpecialObject *lastFloat;
+    FloatingObject *lastFloat;
     while(1)
     {
-        lastFloat = m_specialObjects->prev();
-        if(!lastFloat || (lastFloat->startY != -1 && !(lastFloat->type==SpecialObject::Positioned) )) {
-            m_specialObjects->next();
+        lastFloat = m_floatingObjects->prev();
+        if (!lastFloat || lastFloat->startY != -1) {
+            m_floatingObjects->next();
             break;
         }
         f = lastFloat;
@@ -1223,9 +1250,9 @@ void RenderBlock::positionNewFloats()
     while(f)
     {
         //skip elements copied from elsewhere and positioned elements
-        if (f->node->containingBlock()!=this || f->type==SpecialObject::Positioned)
+        if (f->node->containingBlock()!=this)
         {
-            f = m_specialObjects->next();
+            f = m_floatingObjects->next();
             continue;
         }
 
@@ -1276,9 +1303,9 @@ void RenderBlock::positionNewFloats()
         f->endY = f->startY + _height;
 
 
-        //kdDebug( 6040 ) << "specialObject x/y= (" << f->left << "/" << f->startY << "-" << f->width << "/" << f->endY - f->startY << ")" << endl;
+        //kdDebug( 6040 ) << "floatingObject x/y= (" << f->left << "/" << f->startY << "-" << f->width << "/" << f->endY - f->startY << ")" << endl;
 
-        f = m_specialObjects->next();
+        f = m_floatingObjects->next();
     }
 }
 
@@ -1329,17 +1356,17 @@ int
 RenderBlock::leftRelOffset(int y, int fixedOffset, int *heightRemaining ) const
 {
     int left = fixedOffset;
-    if(!m_specialObjects)
+    if(!m_floatingObjects)
         return left;
 
     if ( heightRemaining ) *heightRemaining = 1;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
     {
         //kdDebug( 6040 ) <<(void *)this << " left: sy, ey, x, w " << r->startY << "," << r->endY << "," << r->left << "," << r->width << " " << endl;
         if (r->startY <= y && r->endY > y &&
-            r->type == SpecialObject::FloatLeft &&
+            r->type == FloatingObject::FloatLeft &&
             r->left + r->width > left) {
             left = r->left + r->width;
             if ( heightRemaining ) *heightRemaining = r->endY - y;
@@ -1371,16 +1398,16 @@ RenderBlock::rightRelOffset(int y, int fixedOffset, int *heightRemaining ) const
 {
     int right = fixedOffset;
 
-    if (!m_specialObjects) return right;
+    if (!m_floatingObjects) return right;
 
     if (heightRemaining) *heightRemaining = 1;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
     {
         //kdDebug( 6040 ) << "right: sy, ey, x, w " << r->startY << "," << r->endY << "," << r->left << "," << r->width << " " << endl;
         if (r->startY <= y && r->endY > y &&
-            r->type == SpecialObject::FloatRight &&
+            r->type == FloatingObject::FloatRight &&
             r->left < right) {
             right = r->left;
             if ( heightRemaining ) *heightRemaining = r->endY - y;
@@ -1400,12 +1427,12 @@ RenderBlock::lineWidth(int y) const
 int
 RenderBlock::nearestFloatBottom(int height) const
 {
-    if (!m_specialObjects) return 0;
+    if (!m_floatingObjects) return 0;
     int bottom=0;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
-        if (r->endY>height && (r->endY<bottom || bottom==0) && (int)r->type <= (int)SpecialObject::FloatRight)
+        if (r->endY>height && (r->endY<bottom || bottom==0))
             bottom=r->endY;
     return bottom;
 }
@@ -1413,12 +1440,12 @@ RenderBlock::nearestFloatBottom(int height) const
 int
 RenderBlock::floatBottom() const
 {
-    if (!m_specialObjects) return 0;
+    if (!m_floatingObjects) return 0;
     int bottom=0;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
-        if (r->endY>bottom && (int)r->type <= (int)SpecialObject::FloatRight)
+        if (r->endY>bottom)
             bottom=r->endY;
     return bottom;
 }
@@ -1443,22 +1470,27 @@ RenderBlock::lowestPosition() const
 
     //kdDebug(0) << "     bottom = " << bottom << endl;
 
-    if (m_specialObjects) {
-        SpecialObject* r;
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    if (m_floatingObjects) {
+        FloatingObject* r;
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
         for ( ; (r = it.current()); ++it ) {
-            lp = 0;
-            if ( r->type == SpecialObject::FloatLeft || r->type == SpecialObject::FloatRight ){
-                lp = r->startY + r->node->lowestPosition();
-                //kdDebug(0) << r->node->renderName() << " lp = " << lp << "startY=" << r->startY << endl;
-            } else if ( r->type == SpecialObject::Positioned ) {
-                lp = r->node->yPos() + r->node->lowestPosition();
-            }
+            lp = r->startY + r->node->lowestPosition();
+            //kdDebug(0) << r->node->renderName() << " lp = " << lp << "startY=" << r->startY << endl;
             if( lp > bottom)
                 bottom = lp;
         }
     }
 
+    if (m_positionedObjects) {
+        RenderObject* r;
+        QPtrListIterator<RenderObject> it(*m_positionedObjects);
+        for ( ; (r = it.current()); ++it ) {
+            lp = r->yPos()+ r->lowestPosition();
+            if( lp > bottom)
+                bottom = lp;
+        }
+    }
+    
     if ( overhangingContents() ) {
         RenderObject *child = firstChild();
         while( child ) {
@@ -1487,21 +1519,26 @@ int RenderBlock::rightmostPosition() const
         }
     }
 
-    if (m_specialObjects) {
-        SpecialObject* r;
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    if (m_floatingObjects) {
+        FloatingObject* r;
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
         for ( ; (r = it.current()); ++it ) {
-            int specialRight=0;
-            if ( r->type == SpecialObject::FloatLeft || r->type == SpecialObject::FloatRight ){
-                specialRight = r->left + r->node->rightmostPosition();
-            } else if ( r->type == SpecialObject::Positioned ) {
-                specialRight = r->node->xPos() + r->node->rightmostPosition();
-            }
+            int specialRight = r->left + r->node->rightmostPosition();
             if (specialRight > right)
                 right = specialRight;
         }
     }
 
+    if (m_positionedObjects) {
+        RenderObject* r;
+        QPtrListIterator<RenderObject> it(*m_positionedObjects);
+        for ( ; (r = it.current()); ++it ) {
+            int specialRight = r->xPos()+ r->rightmostPosition();
+            if (specialRight > right)
+                right = specialRight;
+        }
+    }
+    
     if ( overhangingContents() ) {
         RenderObject *child = firstChild();
         while( child ) {
@@ -1520,12 +1557,12 @@ int RenderBlock::rightmostPosition() const
 int
 RenderBlock::leftBottom()
 {
-    if (!m_specialObjects) return 0;
+    if (!m_floatingObjects) return 0;
     int bottom=0;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
-        if (r->endY>bottom && r->type == SpecialObject::FloatLeft)
+        if (r->endY>bottom && r->type == FloatingObject::FloatLeft)
             bottom=r->endY;
 
     return bottom;
@@ -1534,12 +1571,12 @@ RenderBlock::leftBottom()
 int
 RenderBlock::rightBottom()
 {
-    if (!m_specialObjects) return 0;
+    if (!m_floatingObjects) return 0;
     int bottom=0;
-    SpecialObject* r;
-    QPtrListIterator<SpecialObject> it(*m_specialObjects);
+    FloatingObject* r;
+    QPtrListIterator<FloatingObject> it(*m_floatingObjects);
     for ( ; (r = it.current()); ++it )
-        if (r->endY>bottom && r->type == SpecialObject::FloatRight)
+        if (r->endY>bottom && r->type == FloatingObject::FloatRight)
             bottom=r->endY;
 
     return bottom;
@@ -1548,22 +1585,11 @@ RenderBlock::rightBottom()
 void
 RenderBlock::clearFloats()
 {
-    //kdDebug( 6040 ) << this <<" clearFloats" << endl;
-    if (m_specialObjects) {
-        if( overhangingContents() ) {
-            m_specialObjects->first();
-            while ( m_specialObjects->current()) {
-                if ( !(m_specialObjects->current()->type == SpecialObject::Positioned) )
-                    m_specialObjects->remove();
-                else
-                    m_specialObjects->next();
-            }
-        } else
-            m_specialObjects->clear();
-    }
+    if (m_floatingObjects)
+        m_floatingObjects->clear();
 
     if (isFloating() || isPositioned()) return;
-
+    
     RenderObject *prev = previousSibling();
 
     // find the element to copy the floats from
@@ -1603,7 +1629,7 @@ RenderBlock::clearFloats()
     // add overhanging special objects from the previous RenderBlock
     if(!prev->isRenderBlock()) return;
     RenderBlock * flow = static_cast<RenderBlock *>(prev);
-    if(!flow->m_specialObjects) return;
+    if(!flow->m_floatingObjects) return;
     if( ( style()->htmlHacks() || isTable() ) && style()->flowAroundFloats())
         return; //html tables and lists flow as blocks
 
@@ -1618,65 +1644,82 @@ void RenderBlock::addOverHangingFloats( RenderBlock *flow, int xoff, int offset,
 #endif
 
     // Prevent floats from being added to the root by <html>.
-    if ( !flow->m_specialObjects || (child && flow->isHtml()) )
+    if ( !flow->m_floatingObjects || (child && flow->isHtml()) )
         return;
 
     // we have overhanging floats
-    if (!m_specialObjects) {
-        m_specialObjects = new QSortedList<SpecialObject>;
-        m_specialObjects->setAutoDelete(true);
+    if (!m_floatingObjects) {
+        m_floatingObjects = new QPtrList<FloatingObject>;
+        m_floatingObjects->setAutoDelete(true);
     }
 
-    QPtrListIterator<SpecialObject> it(*flow->m_specialObjects);
-    SpecialObject *r;
+    QPtrListIterator<FloatingObject> it(*flow->m_floatingObjects);
+    FloatingObject *r;
     for ( ; (r = it.current()); ++it ) {
-        if ( (int)r->type <= (int)SpecialObject::FloatRight &&
-             ( ( !child && r->endY > offset ) ||
-               ( child && flow->yPos() + r->endY > height() ) ) ) {
+        if ( ( !child && r->endY > offset ) ||
+             ( child && flow->yPos() + r->endY > height() ) ) {
 
             if (child && (flow->enclosingLayer() == enclosingLayer()))
                 // Set noPaint to true only if we didn't cross layers.
                 r->noPaint = true;
 
-            SpecialObject* f = 0;
+            FloatingObject* f = 0;
             // don't insert it twice!
-            QPtrListIterator<SpecialObject> it(*m_specialObjects);
+            QPtrListIterator<FloatingObject> it(*m_floatingObjects);
             while ( (f = it.current()) ) {
                 if (f->node == r->node) break;
                 ++it;
             }
             if ( !f ) {
-                SpecialObject *special = new SpecialObject(r->type);
-                special->count = m_specialObjects->count();
-                special->startY = r->startY - offset;
-                special->endY = r->endY - offset;
-                special->left = r->left - xoff;
+                FloatingObject *floatingObj = new FloatingObject(r->type);
+                floatingObj->startY = r->startY - offset;
+                floatingObj->endY = r->endY - offset;
+                floatingObj->left = r->left - xoff;
                 // Applying the child's margin makes no sense in the case where the child was passed in.
                 // since his own margin was added already through the subtraction of the |xoff| variable
                 // above.  |xoff| will equal -flow->marginLeft() in this case, so it's already been taken
                 // into account.  Only apply this code if |child| is false, since otherwise the left margin
                 // will get applied twice. -dwh
                 if (!child && flow != parent())
-                    special->left += flow->marginLeft();
+                    floatingObj->left += flow->marginLeft();
                 if ( !child ) {
-                    special->left -= marginLeft();
-                    special->noPaint = true;
+                    floatingObj->left -= marginLeft();
+                    floatingObj->noPaint = true;
                 }
                 else
                     // Only paint if |flow| isn't.
-                    special->noPaint = !r->noPaint;
+                    floatingObj->noPaint = !r->noPaint;
                 
-                special->width = r->width;
-                special->node = r->node;
-                m_specialObjects->append(special);
+                floatingObj->width = r->width;
+                floatingObj->node = r->node;
+                m_floatingObjects->append(floatingObj);
 #ifdef DEBUG_LAYOUT
-                kdDebug( 6040 ) << "addOverHangingFloats x/y= (" << special->left << "/" << special->startY << "-" << special->width << "/" << special->endY - special->startY << ")" << endl;
+                kdDebug( 6040 ) << "addOverHangingFloats x/y= (" << floatingObj->left << "/" << floatingObj->startY << "-" << floatingObj->width << "/" << floatingObj->endY - floatingObj->startY << ")" << endl;
 #endif
             }
         }
     }
 }
 
+void RenderBlock::markAllDescendantsWithFloatsForLayout()
+{
+    if (style()->htmlHacks() && style()->flowAroundFloats() && style()->width().isPercent())
+        // The child's width can be a percentage width and if it has the quirky flowAroundFloats
+        // property set, when the child shifts to clear an item, its width can change (because it
+        // has more available line width.
+        // So go ahead an mark these items as dirty.
+        setLayouted(false);
+
+    if (isTable() || isFloatingOrPositioned() || !containsFloats())
+        return;
+
+    setLayouted(false);
+    
+    // Iterate over our children and mark them as needed.
+    for (RenderObject* child = firstChild(); child; child = child->nextSibling())
+        child->markAllDescendantsWithFloatsForLayout();
+}
+
 bool RenderBlock::checkClear(RenderObject *child)
 {
     //kdDebug( 6040 ) << "checkClear oldheight=" << m_height << endl;
@@ -1705,17 +1748,17 @@ bool RenderBlock::checkClear(RenderObject *child)
 
 bool RenderBlock::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty, bool inBox)
 {
-    if (m_specialObjects) {
+    if (m_floatingObjects) {
         int stx = _tx + xPos();
         int sty = _ty + yPos();
         if (isRoot()) {
             stx += static_cast<RenderRoot*>(this)->view()->contentsX();
             sty += static_cast<RenderRoot*>(this)->view()->contentsY();
         }
-        SpecialObject* o;
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
+        FloatingObject* o;
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
         for (it.toLast(); (o = it.current()); --it)
-            if (o->node->isFloating() && !o->noPaint)
+            if (!o->noPaint)
                 inBox |= o->node->nodeAtPoint(info, _x, _y,
                                               stx+o->left + o->node->marginLeft() - o->node->xPos(),
                                               sty+o->startY + o->node->marginTop() - o->node->yPos());
@@ -2205,16 +2248,16 @@ void RenderBlock::printTree(int indent) const
 {
     RenderFlow::printTree(indent);
 
-    if (m_specialObjects)
+    if (m_floatingObjects)
     {
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
-        SpecialObject *r;
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
+        FloatingObject *r;
         for ( ; (r = it.current()); ++it )
         {
             QString s;
             s.fill(' ', indent);
             kdDebug() << s << renderName() << ":  " <<
-                (r->type == SpecialObject::FloatLeft ? "FloatLeft" : (r->type == SpecialObject::FloatRight ? "FloatRight" : "Positioned"))  <<
+                (r->type == FloatingObject::FloatLeft ? "FloatLeft" : "FloatRight" )  <<
                 "[" << r->node->renderName() << ": " << (void*)r->node << "] (" << r->startY << " - " << r->endY << ")" << "width: " << r->width <<
                 endl;
         }
@@ -2227,11 +2270,11 @@ void RenderBlock::dump(QTextStream *stream, QString ind) const
     if (m_pre) { *stream << " pre"; }
     if (m_firstLine) { *stream << " firstLine"; }
 
-    if (m_specialObjects && !m_specialObjects->isEmpty())
+    if (m_floatingObjects && !m_floatingObjects->isEmpty())
     {
         *stream << " special(";
-        QPtrListIterator<SpecialObject> it(*m_specialObjects);
-        SpecialObject *r;
+        QPtrListIterator<FloatingObject> it(*m_floatingObjects);
+        FloatingObject *r;
         bool first = true;
         for ( ; (r = it.current()); ++it )
         {
diff --git a/WebCore/khtml/rendering/render_block.h b/WebCore/khtml/rendering/render_block.h
index 3b3d156..92ec781 100644
--- a/WebCore/khtml/rendering/render_block.h
+++ b/WebCore/khtml/rendering/render_block.h
@@ -23,7 +23,7 @@
 #ifndef RENDER_BLOCK_H
 #define RENDER_BLOCK_H
 
-#include <qsortedlist.h>
+#include <qptrlist.h>
 
 #include "render_flow.h"
 
@@ -38,7 +38,6 @@ public:
     virtual const char *renderName() const;
 
     virtual bool isRenderBlock() const { return true; }
-    virtual bool containsSpecial() { return m_specialObjects!=0; }
     
     virtual bool childrenInline() const { return m_childrenInline; }
     virtual void setChildrenInline(bool b) { m_childrenInline = b; }
@@ -88,8 +87,11 @@ public:
     virtual void layout();
     void layoutBlockChildren( bool relayoutChildren );
     void layoutInlineChildren( bool relayoutChildren );
-    void layoutSpecialObjects( bool relayoutChildren );
 
+    void layoutPositionedObjects( bool relayoutChildren );
+    void insertPositionedObject(RenderObject *o);
+    void removePositionedObject(RenderObject *o);
+    
     // the implementation of the following functions is in bidi.cpp
     void bidiReorderLine(const BidiIterator &start, const BidiIterator &end);
     BidiIterator findNextLineBreak(BidiIterator &start);
@@ -106,14 +108,17 @@ public:
     void paintFloats(QPainter *p, int _x, int _y,
                      int _w, int _h, int _tx, int _ty, bool paintSelection = false);
     
-    
-    void insertSpecialObject(RenderObject *o);
-    void removeSpecialObject(RenderObject *o);
+
+    void insertFloatingObject(RenderObject *o);
+    void removeFloatingObject(RenderObject *o);
 
     // called from lineWidth, to position the floats added in the last line.
     void positionNewFloats();
     void clearFloats();
     bool checkClear(RenderObject *child);
+    virtual void markAllDescendantsWithFloatsForLayout();
+    
+    virtual bool containsFloats() { return m_floatingObjects!=0; }
     virtual bool hasOverhangingFloats() { return floatBottom() > m_height; }
     void addOverHangingFloats( RenderBlock *block, int xoffset, int yoffset, bool child = false );
     
@@ -158,47 +163,35 @@ protected:
     void newLine();
     
 protected:
-    struct SpecialObject {
+    struct FloatingObject {
         enum Type {
             FloatLeft,
-            FloatRight,
-            Positioned
+            FloatRight
         };
 
-        SpecialObject(Type _type) {
+        FloatingObject(Type _type) {
             node = 0;
             startY = 0;
             endY = 0;
             type = _type;
             left = 0;
             width = 0;
-            count = 0;
             noPaint = false;
-        }
 
+        }
         RenderObject* node;
         int startY;
         int endY;
         short left;
         short width;
-        short count;
-        Type type : 2; // left or right aligned
-        bool noPaint: 1;
-
-        bool operator==(const SpecialObject& ) const
-        {
-            return false;
-        }
-        bool operator<(const SpecialObject& o) const
-        {
-            if(node->style()->zIndex() == o.node->style()->zIndex())
-                return count < o.count;
-            return node->style()->zIndex() < o.node->style()->zIndex();
-        }
+        Type type : 1; // left or right aligned
+        bool noPaint : 1;
     };
     
 protected:
-    QSortedList<SpecialObject>* m_specialObjects;
+    QPtrList<FloatingObject>* m_floatingObjects;
+    QPtrList<RenderObject>* m_positionedObjects;
+    
     bool m_childrenInline : 1;
     bool m_pre            : 1;
     bool m_firstLine      : 1; // used in inline layouting
diff --git a/WebCore/khtml/rendering/render_container.cpp b/WebCore/khtml/rendering/render_container.cpp
index 9481182..d1fa29a 100644
--- a/WebCore/khtml/rendering/render_container.cpp
+++ b/WebCore/khtml/rendering/render_container.cpp
@@ -55,7 +55,7 @@ void RenderContainer::detach(RenderArena* renderArena)
     
     RenderObject* next;
     for(RenderObject* n = m_first; n; n = next ) {
-        n->removeFromSpecialObjects();
+        n->removeFromObjectLists();
         n->setParent(0);
         next = n->nextSibling();
         n->detach(renderArena);
diff --git a/WebCore/khtml/rendering/render_flow.cpp b/WebCore/khtml/rendering/render_flow.cpp
index d8779bb..a256bc1 100644
--- a/WebCore/khtml/rendering/render_flow.cpp
+++ b/WebCore/khtml/rendering/render_flow.cpp
@@ -89,7 +89,7 @@ void RenderFlow::addChildWithContinuation(RenderObject* newChild, RenderObject*
     RenderFlow* beforeChildParent = beforeChild ? static_cast<RenderFlow*>(beforeChild->parent()) : 
                                     (flow->continuation() ? flow->continuation() : flow);
     
-    if (newChild->isSpecial())
+    if (newChild->isFloatingOrPositioned())
         return beforeChildParent->addChildToFlow(newChild, beforeChild);
     
     // A continuation always consists of two potential candidates: an inline or an anonymous
diff --git a/WebCore/khtml/rendering/render_inline.cpp b/WebCore/khtml/rendering/render_inline.cpp
index 3867318..f8e61ce 100644
--- a/WebCore/khtml/rendering/render_inline.cpp
+++ b/WebCore/khtml/rendering/render_inline.cpp
@@ -69,7 +69,7 @@ void RenderInline::addChildToFlow(RenderObject* newChild, RenderObject* beforeCh
     if (!newChild->isText() && newChild->style()->position() != STATIC)
         setOverhangingContents();
     
-    if (!newChild->isInline() && !newChild->isSpecial() )
+    if (!newChild->isInline() && !newChild->isFloatingOrPositioned() )
     {
         // We are placing a block inside an inline. We have to perform a split of this
         // inline into continuations.  This involves creating an anonymous block box to hold
@@ -381,7 +381,7 @@ bool RenderInline::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty,
                     info.setURLElement(p->element());
                     break;
                 }
-                if (!isSpecial()) break;
+                if (!isFloatingOrPositioned()) break;
                 p = p->parent();
             }
         }
diff --git a/WebCore/khtml/rendering/render_object.cpp b/WebCore/khtml/rendering/render_object.cpp
index 5de7637..4d1c951 100644
--- a/WebCore/khtml/rendering/render_object.cpp
+++ b/WebCore/khtml/rendering/render_object.cpp
@@ -351,6 +351,10 @@ RenderObject* RenderObject::offsetParent() const
     return curr;
 }
 
+void RenderObject::markAllDescendantsWithFloatsForLayout()
+{
+}
+
 void RenderObject::setLayouted(bool b) 
 {
     m_layouted = b;
@@ -847,14 +851,14 @@ void RenderObject::setStyle(RenderStyle *style)
         // having an outline to not having an outline.
         repaint();
         
-    if (isFloating() || isPositioned()) {
-        // For changes in float or position, we need to conceivably remove ourselves
-        // from the special objects list.
-        bool floatOrPos = style->isFloating() || style->position() == ABSOLUTE ||
-                          style->position() == FIXED;
-        if (!floatOrPos)
-            removeFromSpecialObjects();
-    }
+    if (isFloating() && !style->isFloating())
+        // For changes in float styles, we need to conceivably remove ourselves
+        // from the floating objects list.
+        removeFromObjectLists();
+    else if (isPositioned() && (style->position() != ABSOLUTE && style->position() != FIXED))
+        // For changes in positioning styles, we need to conceivably remove ourselves
+        // from the positioned objects list.
+        removeFromObjectLists();
     
     //qDebug("new style, diff=%d", d);
     // reset style flags
@@ -1051,15 +1055,23 @@ void RenderObject::invalidateLayout()
 }
 #endif
 
-void RenderObject::removeFromSpecialObjects()
+void RenderObject::removeFromObjectLists()
 {
-    if (isPositioned() || isFloating()) {
+    if (isFloating()) {
 	RenderObject *p;
 	for (p = parent(); p; p = p->parent()) {
             if (p->isRenderBlock()) 
-		static_cast<RenderBlock*>(p)->removeSpecialObject(this);
+		static_cast<RenderBlock*>(p)->removeFloatingObject(this);
 	}
     }
+
+    if (isPositioned()) {
+        RenderObject *p;
+        for (p = parent(); p; p = p->parent()) {
+            if (p->isRenderBlock())
+                static_cast<RenderBlock*>(p)->removePositionedObject(this);
+        }
+    }
 }
 
 RenderArena* RenderObject::renderArena() const
@@ -1230,7 +1242,7 @@ bool RenderObject::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx, int _ty,
                     info.setURLElement(p->element());
                     break;
                 }
-                if (!isSpecial()) break;
+                if (!isFloatingOrPositioned()) break;
                 p = p->parent();
             }
         }
diff --git a/WebCore/khtml/rendering/render_object.h b/WebCore/khtml/rendering/render_object.h
index 1693c21..6a0bb4d 100644
--- a/WebCore/khtml/rendering/render_object.h
+++ b/WebCore/khtml/rendering/render_object.h
@@ -227,7 +227,8 @@ public:
     RenderObject *container() const;
 
     void setOverhangingContents(bool p=true);
-    
+
+    virtual void markAllDescendantsWithFloatsForLayout();
     void setLayouted(bool b=true);
 
     void setMinMaxKnown(bool b=true) {
@@ -512,9 +513,8 @@ public:
 
     virtual bool isHidden() const { return isFloating() || isPositioned(); }
 
-    // Special objects are objects that are neither really inline nor blocklevel
-    bool isSpecial() const { return (isFloating() || isPositioned()); };
-    virtual bool containsSpecial() { return false; }
+    bool isFloatingOrPositioned() const { return (isFloating() || isPositioned()); };
+    virtual bool containsFloats() { return false; }
     virtual bool hasOverhangingFloats() { return false; }
 
     // positioning of inline childs (bidi)
@@ -541,7 +541,7 @@ public:
     // unused: void invalidateLayout();
 
     virtual void calcVerticalMargins() {}
-    void removeFromSpecialObjects();
+    void removeFromObjectLists();
 
     virtual void detach(RenderArena* renderArena);
 
@@ -560,7 +560,7 @@ protected:
 
     virtual QRect viewRect() const;
     void remove() {
-        removeFromSpecialObjects();
+        removeFromObjectLists();
 
         if ( parent() )
             //have parent, take care of the tree integrity
diff --git a/WebCore/khtml/rendering/render_root.cpp b/WebCore/khtml/rendering/render_root.cpp
index eae1b9c..9cea269 100644
--- a/WebCore/khtml/rendering/render_root.cpp
+++ b/WebCore/khtml/rendering/render_root.cpp
@@ -162,7 +162,7 @@ void RenderRoot::layout()
 
 
     // ### we could maybe do the call below better and only pass true if the docsize changed.
-    layoutSpecialObjects( true );
+    layoutPositionedObjects( true );
 
 #ifdef SPEED_DEBUG
     kdDebug() << "RenderRoot::end time used=" << qt.elapsed() << endl;
diff --git a/WebCore/khtml/rendering/render_table.cpp b/WebCore/khtml/rendering/render_table.cpp
index aeca144..14e8da9 100644
--- a/WebCore/khtml/rendering/render_table.cpp
+++ b/WebCore/khtml/rendering/render_table.cpp
@@ -353,7 +353,7 @@ void RenderTable::layout()
 
     // table can be containing block of positioned elements.
     // ### only pass true if width or height changed.
-    layoutSpecialObjects( true );
+    layoutPositionedObjects( true );
 
     setLayouted();
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list