detach patch

David Hyatt hyatt at apple.com
Thu Oct 2 14:38:44 CEST 2003


This patch is a simplification of detach() to not need a renderArena  
argument.  In CSS2.1, the restriction is being lifted on generated  
content not being able to be positioned etc., which means generated  
content can have layers.  The generated content needs to be able to get  
to a document even when not rooted (just like normal content can).

The solution we came up with for this problem was to make generated  
content put the document() into the m_node pointer.  The anonymous bit  
is then used in element() to hand back an element only if you aren't  
anonymous.

This change actually sped up our page-load time by 1% or so.

Index: khtml/rendering/render_block.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_block.cpp,v
retrieving revision 1.59
diff -u -p -r1.59 khtml/rendering/render_block.cpp
--- khtml/rendering/render_block.cpp	2003/09/30 18:45:46	1.59
+++ khtml/rendering/render_block.cpp	2003/10/01 20:55:03
@@ -78,13 +78,12 @@ void RenderBlock::setStyle(RenderStyle*
      RenderObject *child = firstChild();
      while (child != 0)
      {
-        if (child->isAnonymousBox())
+        if (child->isAnonymous())
          {
              RenderStyle* newStyle = new RenderStyle();
              newStyle->inheritFrom(style());
              newStyle->setDisplay(BLOCK);
              child->setStyle(newStyle);
-            child->setIsAnonymousBox(true);
          }
          child = child->nextSibling();
      }
@@ -124,7 +123,7 @@ void RenderBlock::addChildToFlow(RenderO
              pseudoStyle->setDisplay( pseudoStyle->isFloating() ? BLOCK  
: INLINE);
              pseudoStyle->setPosition( STATIC ); // CSS2 says  
first-letter can't be positioned.

-            RenderObject* firstLetter = RenderFlow::createFlow(0,  
pseudoStyle, renderArena()); // anonymous box
+            RenderObject* firstLetter =  
RenderFlow::createAnonymousFlow(document(), pseudoStyle); // anonymous  
box
              firstLetterContainer->addChild(firstLetter,  
firstLetterContainer->firstChild());

              DOMStringImpl* oldText = newTextChild->string();
@@ -138,7 +137,7 @@ void RenderBlock::addChildToFlow(RenderO
                  //kdDebug( 6040 ) << "letter= '" <<  
DOMString(oldText->substring(0,length)).string() << "'" << endl;
                   
newTextChild->setText(oldText->substring(length,oldText->l-length));

-                RenderText* letter = new (renderArena())  
RenderText(newTextChild->element(), oldText->substring(0,length));
+                RenderText* letter = new (renderArena())  
RenderText(newTextChild->node(), oldText->substring(0,length));
                  RenderStyle* newStyle = new RenderStyle();
                  newStyle->inheritFrom(pseudoStyle);
                  letter->setStyle(newStyle);
@@ -154,7 +153,7 @@ void RenderBlock::addChildToFlow(RenderO
      if (beforeChild && beforeChild->parent() != this) {

          KHTMLAssert(beforeChild->parent());
-        KHTMLAssert(beforeChild->parent()->isAnonymousBox());
+        KHTMLAssert(beforeChild->parent()->isAnonymous());

          if (newChild->isInline()) {
              beforeChild->parent()->addChild(newChild,beforeChild);
@@ -186,7 +185,7 @@ void RenderBlock::addChildToFlow(RenderO

          if (beforeChild && beforeChild->parent() != this) {
              beforeChild = beforeChild->parent();
-            KHTMLAssert(beforeChild->isAnonymousBox());
+            KHTMLAssert(beforeChild->isAnonymous());
              KHTMLAssert(beforeChild->parent() == this);
          }
      }
@@ -197,14 +196,14 @@ void RenderBlock::addChildToFlow(RenderO
          // a new one is created and inserted into our list of children  
in the appropriate position.
          if (newChild->isInline()) {
              if (beforeChild) {
-                if (beforeChild->previousSibling() &&  
beforeChild->previousSibling()->isAnonymousBox()) {
+                if (beforeChild->previousSibling() &&  
beforeChild->previousSibling()->isAnonymous()) {
                      beforeChild->previousSibling()->addChild(newChild);
                      newChild->setNeedsLayoutAndMinMaxRecalc();
                      return;
                  }
              }
              else {
-                if (m_last && m_last->isAnonymousBox()) {
+                if (m_last && m_last->isAnonymous()) {
                      m_last->addChild(newChild);
                      newChild->setNeedsLayoutAndMinMaxRecalc();
                      return;
@@ -223,7 +222,7 @@ void RenderBlock::addChildToFlow(RenderO
              // We are adding another block child... if the current  
last child is an anonymous box
              // then it needs to be closed.
              // ### get rid of the closing thing altogether this will  
only work during initial parsing
-            if (lastChild() && lastChild()->isAnonymousBox()) {
+            if (lastChild() && lastChild()->isAnonymous()) {
                  lastChild()->close();
              }
          }
@@ -321,8 +320,8 @@ void RenderBlock::removeChild(RenderObje
      RenderObject* next = oldChild->nextSibling();
      bool mergedBlocks = false;
      if (!isInline() && !oldChild->isInline() &&  
!oldChild->continuation() &&
-        prev && prev->isAnonymousBox() && prev->childrenInline() &&
-        next && next->isAnonymousBox() && next->childrenInline()) {
+        prev && prev->isAnonymous() && prev->childrenInline() &&
+        next && next->isAnonymous() && next->childrenInline()) {
          // Take all the children out of the |next| block and put them  
in
          // the |prev| block.
          RenderObject* o = next->firstChild();
@@ -335,7 +334,7 @@ void RenderBlock::removeChild(RenderObje
          prev->setNeedsLayoutAndMinMaxRecalc();

          // Nuke the now-empty block.
-        next->detach(renderArena());
+        next->detach();

          mergedBlocks = true;
      }
@@ -357,7 +356,7 @@ void RenderBlock::removeChild(RenderObje
          }

          // Nuke the now-empty block.
-        anonBlock->detach(renderArena());
+        anonBlock->detach();
      }
  }

@@ -445,7 +444,7 @@ void RenderBlock::layoutBlock(bool relay
          relayoutChildren = true;

      //     kdDebug( 6040 ) << floatingObjects << "," << oldWidth << ","
-    //                     << m_width << ","<< needsLayout() << "," <<  
isAnonymousBox() << ","
+    //                     << m_width << ","<< needsLayout() << "," <<  
isAnonymous() << ","
      //                     << overhangingContents() << "," <<  
isPositioned() << endl;

  #ifdef DEBUG_LAYOUT
@@ -725,7 +724,7 @@ void RenderBlock::layoutBlockChildren( b
              RenderObject* curr = next;
              while (curr && curr->isFloatingOrPositioned())
                  curr = curr->nextSibling();
-            if (curr && curr->isRenderBlock() &&  
!curr->isAnonymousBox() &&
+            if (curr && curr->isRenderBlock() && !curr->isAnonymous()  
&&
                  !curr->isCompact() && !curr->isRunIn()) {
                  curr->calcWidth(); // So that horizontal margins are  
correct.
                  // Need to compute margins for the child as though it  
is a block.
@@ -768,7 +767,7 @@ void RenderBlock::layoutBlockChildren( b
              RenderObject* curr = child->nextSibling();
              while (curr && curr->isFloatingOrPositioned())
                  curr = curr->nextSibling();
-            if (curr && (curr->isRenderBlock() &&  
!curr->isAnonymousBox() && curr->childrenInline() &&
+            if (curr && (curr->isRenderBlock() && !curr->isAnonymous()  
&& curr->childrenInline() &&
                           !curr->isCompact() && !curr->isRunIn())) {
                  // The block acts like an inline, so just null out its
                  // position.
@@ -1283,7 +1282,7 @@ void RenderBlock::paintObject(QPainter *

  #ifdef BOX_DEBUG
      if ( style() && style()->visibility() == VISIBLE ) {
-        if(isAnonymousBox())
+        if(isAnonymous())
              outlineBox(p, _tx, _ty, "green");
          if(isFloating())
              outlineBox(p, _tx, _ty, "yellow");
@@ -2503,7 +2502,7 @@ const char *RenderBlock::renderName() co
          return "RenderBlock (floating)";
      if (isPositioned())
          return "RenderBlock (positioned)";
-    if (isAnonymousBox())
+    if (isAnonymous())
          return "RenderBlock (anonymous)";
      if (isRelPositioned())
          return "RenderBlock (relative positioned)";
Index: khtml/rendering/render_box.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_box.cpp,v
retrieving revision 1.83
diff -u -p -r1.83 khtml/rendering/render_box.cpp
--- khtml/rendering/render_box.cpp	2003/09/26 00:57:15	1.83
+++ khtml/rendering/render_box.cpp	2003/10/01 20:55:03
@@ -118,14 +118,16 @@ RenderBox::~RenderBox()
      //kdDebug( 6040 ) << "Element destructor: this=" <<  
nodeName().string() << endl;
  }

-void RenderBox::detach(RenderArena* renderArena)
+void RenderBox::detach()
  {
      RenderLayer* layer = m_layer;
+
+    RenderArena* arena = renderArena();

-    RenderContainer::detach(renderArena);
+    RenderContainer::detach();

      if (layer)
-        layer->detach(renderArena);
+        layer->detach(arena);
  }

  short RenderBox::contentWidth() const
Index: khtml/rendering/render_box.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_box.h,v
retrieving revision 1.28
diff -u -p -r1.28 khtml/rendering/render_box.h
--- khtml/rendering/render_box.h	2003/09/26 00:57:15	1.28
+++ khtml/rendering/render_box.h	2003/10/01 20:55:03
@@ -50,7 +50,7 @@ public:
      virtual void paint(QPainter *p, int _x, int _y, int _w, int _h,
                         int _tx, int _ty, PaintAction paintAction);

-    virtual void detach(RenderArena* renderArena);
+    virtual void detach();

      virtual short minWidth() const { return m_minWidth; }
      virtual short maxWidth() const { return m_maxWidth; }
Index: khtml/rendering/render_canvas.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_canvas.cpp,v
retrieving revision 1.8
diff -u -p -r1.8 khtml/rendering/render_canvas.cpp
--- khtml/rendering/render_canvas.cpp	2003/09/30 18:45:46	1.8
+++ khtml/rendering/render_canvas.cpp	2003/10/01 20:55:03
@@ -38,6 +38,9 @@ using namespace khtml;
  RenderCanvas::RenderCanvas(DOM::NodeImpl* node, KHTMLView *view)
      : RenderBlock(node)
  {
+    // Clear our anonymous bit.
+    setIsAnonymous(false);
+
      // init RenderObject attributes
      setInline(false);

Index: khtml/rendering/render_container.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/ 
render_container.cpp,v
retrieving revision 1.40
diff -u -p -r1.40 khtml/rendering/render_container.cpp
--- khtml/rendering/render_container.cpp	2003/09/26 00:57:15	1.40
+++ khtml/rendering/render_container.cpp	2003/10/01 20:55:03
@@ -30,6 +30,7 @@
  #include "render_text.h"
  #include "render_image.h"
  #include "render_canvas.h"
+#include "xml/dom_docimpl.h"

  #include <kdebug.h>
  #include <assert.h>
@@ -48,22 +49,22 @@ RenderContainer::~RenderContainer()
  {
  }

-void RenderContainer::detach(RenderArena* renderArena)
+void RenderContainer::detach()
  {
      if (continuation())
-        continuation()->detach(renderArena);
+        continuation()->detach();

      RenderObject* next;
      for(RenderObject* n = m_first; n; n = next ) {
          n->removeFromObjectLists();
          n->setParent(0);
          next = n->nextSibling();
-        n->detach(renderArena);
+        n->detach();
      }
      m_first = 0;
      m_last = 0;

-    RenderObject::detach(renderArena);
+    RenderObject::detach();
  }

  bool RenderContainer::canHaveChildren() const
@@ -132,16 +133,15 @@ void RenderContainer::addChild(RenderObj
          RenderTable *table;
          if( !beforeChild )
              beforeChild = lastChild();
-        if( beforeChild && beforeChild->isAnonymousBox() &&  
beforeChild->isTable() )
+        if( beforeChild && beforeChild->isAnonymous() &&  
beforeChild->isTable() )
              table = static_cast<RenderTable *>(beforeChild);
          else {
              //kdDebug( 6040 ) << "creating anonymous table" << endl;
-            table = new (renderArena()) RenderTable(0 /* is anonymous  
*/);
+            table = new (renderArena()) RenderTable(document() /* is  
anonymous */);
              RenderStyle *newStyle = new RenderStyle();
              newStyle->inheritFrom(style());
              newStyle->setDisplay(TABLE);
              table->setStyle(newStyle);
-            table->setIsAnonymousBox(true);
              addChild(table, beforeChild);
          }
          table->addChild(newChild);
@@ -302,18 +302,18 @@ void RenderContainer::updatePseudoChild(
      for (ContentData* contentData = pseudo->contentData();
           contentData; contentData = contentData->_nextContent) {
          if (!pseudoContainer)
-            pseudoContainer = RenderFlow::createFlow(0, pseudo,  
renderArena()); /* anonymous box */
+            pseudoContainer =  
RenderFlow::createAnonymousFlow(document(), pseudo); /* anonymous box  
*/

          if (contentData->contentType() == CONTENT_TEXT)
          {
-            RenderText* t = new (renderArena()) RenderText(0  
/*anonymous object */, contentData->contentText());
+            RenderText* t = new (renderArena()) RenderText(document()  
/*anonymous object */, contentData->contentText());
              t->setStyle(pseudo);
              pseudoContainer->addChild(t);
              t->close();
          }
          else if (contentData->contentType() == CONTENT_OBJECT)
          {
-            RenderImage* img = new (renderArena()) RenderImage(0);
+            RenderImage* img = new (renderArena())  
RenderImage(document()); /* Anonymous object */
              RenderStyle* style = new RenderStyle();
              style->inheritFrom(pseudo);
              img->setStyle(style);
@@ -365,7 +365,7 @@ void RenderContainer::insertChildNode(Re
      }

      KHTMLAssert(!child->parent());
-    while ( beforeChild->parent() != this &&  
beforeChild->parent()->isAnonymousBox() )
+    while ( beforeChild->parent() != this &&  
beforeChild->parent()->isAnonymous() )
  	beforeChild = beforeChild->parent();
      KHTMLAssert(beforeChild->parent() == this);

@@ -410,7 +410,7 @@ void RenderContainer::removeLeftoverAnon
      while( child ) {
  	RenderObject *next = child->nextSibling();
  	
-	if ( child->isRenderBlock() && child->isAnonymousBox() &&  
!child->continuation() && !child->childrenInline() &&  
!child->isTableCell() ) {
+	if ( child->isRenderBlock() && child->isAnonymous() &&  
!child->continuation() && !child->childrenInline() &&  
!child->isTableCell() ) {
  	    RenderObject *firstAnChild = child->firstChild();
  	    RenderObject *lastAnChild = child->lastChild();
  	    if ( firstAnChild ) {
@@ -444,7 +444,7 @@ void RenderContainer::removeLeftoverAnon
  		c->m_first = 0;
  		c->m_next = 0;
  	    }
-	    child->detach(renderArena());
+	    child->detach();
  	}
  	child = next;
      }
Index: khtml/rendering/render_container.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_container.h,v
retrieving revision 1.11
diff -u -p -r1.11 khtml/rendering/render_container.h
--- khtml/rendering/render_container.h	2003/08/11 23:41:02	1.11
+++ khtml/rendering/render_container.h	2003/10/01 20:55:03
@@ -44,7 +44,7 @@ public:
      virtual void addChild(RenderObject *newChild, RenderObject  
*beforeChild = 0);
      virtual void removeChild(RenderObject *oldChild);

-    virtual void detach(RenderArena* renderArena);
+    virtual void detach();

      virtual RenderObject* removeChildNode(RenderObject* child);
      virtual void appendChildNode(RenderObject* child);
Index: khtml/rendering/render_flow.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_flow.cpp,v
retrieving revision 1.110
diff -u -p -r1.110 khtml/rendering/render_flow.cpp
--- khtml/rendering/render_flow.cpp	2003/09/26 00:57:15	1.110
+++ khtml/rendering/render_flow.cpp	2003/10/01 20:55:03
@@ -45,13 +45,13 @@
  using namespace DOM;
  using namespace khtml;

-RenderFlow* RenderFlow::createFlow(DOM::NodeImpl* node, RenderStyle*  
style, RenderArena* arena)
+RenderFlow* RenderFlow::createAnonymousFlow(DOM::DocumentImpl* doc,  
RenderStyle* style)
  {
      RenderFlow* result;
      if (style->display() == INLINE)
-        result = new (arena) RenderInline(node);
+        result = new (doc->renderArena()) RenderInline(doc);
      else
-        result = new (arena) RenderBlock(node);
+        result = new (doc->renderArena()) RenderBlock(doc);
      result->setStyle(style);
      return result;
  }
@@ -125,11 +125,10 @@ void RenderFlow::addChild(RenderObject *
      return addChildToFlow(newChild, beforeChild);
  }

-void RenderFlow::deleteLineBoxes(RenderArena* arena)
+void RenderFlow::deleteLineBoxes()
  {
      if (m_firstLineBox) {
-        if (!arena)
-            arena = renderArena();
+        RenderArena* arena = renderArena();
          InlineRunBox *curr=m_firstLineBox, *next=0;
          while (curr) {
              next = curr->nextLineBox();
@@ -141,10 +140,10 @@ void RenderFlow::deleteLineBoxes(RenderA
      }
  }

-void RenderFlow::detach(RenderArena* renderArena)
+void RenderFlow::detach()
  {
-    deleteLineBoxes(renderArena);
-    RenderBox::detach(renderArena);
+    deleteLineBoxes();
+    RenderBox::detach();
  }

  InlineBox* RenderFlow::createInlineBox(bool makePlaceHolderBox, bool  
isRootLineBox)
Index: khtml/rendering/render_flow.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_flow.h,v
retrieving revision 1.44
diff -u -p -r1.44 khtml/rendering/render_flow.h
--- khtml/rendering/render_flow.h	2003/09/26 00:57:15	1.44
+++ khtml/rendering/render_flow.h	2003/10/01 20:55:03
@@ -54,10 +54,10 @@ public:
      virtual void addChildToFlow(RenderObject* newChild, RenderObject*  
beforeChild) = 0;
      virtual void addChild(RenderObject *newChild, RenderObject  
*beforeChild = 0);

-    static RenderFlow* createFlow(DOM::NodeImpl* node, RenderStyle*  
style, RenderArena* arena);
+    static RenderFlow* createAnonymousFlow(DOM::DocumentImpl* doc,  
RenderStyle* style);

-    void deleteLineBoxes(RenderArena* arena=0);
-    virtual void detach(RenderArena* arena);
+    void deleteLineBoxes();
+    virtual void detach();

      InlineFlowBox* firstLineBox() const { return m_firstLineBox; }
      InlineFlowBox* lastLineBox() const { return m_lastLineBox; }
Index: khtml/rendering/render_form.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_form.cpp,v
retrieving revision 1.62
diff -u -p -r1.62 khtml/rendering/render_form.cpp
--- khtml/rendering/render_form.cpp	2003/09/30 18:45:47	1.62
+++ khtml/rendering/render_form.cpp	2003/10/01 20:55:03
@@ -1325,13 +1325,13 @@ RenderTextArea::RenderTextArea(HTMLTextA
      connect(edit,SIGNAL(clicked()),this,SLOT(slotClicked()));
  }

-void RenderTextArea::detach(RenderArena *arena)
+void RenderTextArea::detach()
  {
      if ( element()->m_dirtyvalue ) {
          element()->m_value = text();
          element()->m_dirtyvalue = false;
      }
-    RenderFormElement::detach(arena);
+    RenderFormElement::detach();
  }

  void RenderTextArea::handleFocusOut()
Index: khtml/rendering/render_form.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_form.h,v
retrieving revision 1.32
diff -u -p -r1.32 khtml/rendering/render_form.h
--- khtml/rendering/render_form.h	2003/08/27 20:53:13	1.32
+++ khtml/rendering/render_form.h	2003/10/01 20:55:03
@@ -437,7 +437,7 @@ class RenderTextArea : public RenderForm
  public:
      RenderTextArea(DOM::HTMLTextAreaElementImpl *element);

-    virtual void detach(RenderArena *arena);
+    virtual void detach();

      virtual const char *renderName() const { return "RenderTextArea"; }
      virtual void calcMinMaxWidth();
Index: khtml/rendering/render_image.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_image.cpp,v
retrieving revision 1.40
diff -u -p -r1.40 khtml/rendering/render_image.cpp
--- khtml/rendering/render_image.cpp	2003/09/26 00:57:15	1.40
+++ khtml/rendering/render_image.cpp	2003/10/01 20:55:03
@@ -49,8 +49,8 @@ using namespace khtml;

  //  
------------------------------------------------------------------------ 
-

-RenderImage::RenderImage(HTMLElementImpl *_element)
-    : RenderReplaced(_element)
+RenderImage::RenderImage(NodeImpl *_node)
+    : RenderReplaced(_node)
  {
      image = 0;
      berrorPic = false;
@@ -432,7 +432,7 @@ void RenderImage::reload()
  }
  #endif

-void RenderImage::detach(RenderArena *arena)
+void RenderImage::detach()
  {
      NodeImpl *node = element();
      if (node) {
@@ -441,7 +441,7 @@ void RenderImage::detach(RenderArena *ar
              document->removeImage(this);
          }
      }
-    RenderReplaced::detach(arena);
+    RenderReplaced::detach();
  }

  bool RenderImage::nodeAtPoint(NodeInfo& info, int _x, int _y, int _tx,  
int _ty,
Index: khtml/rendering/render_image.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_image.h,v
retrieving revision 1.12
diff -u -p -r1.12 khtml/rendering/render_image.h
--- khtml/rendering/render_image.h	2003/09/19 22:54:38	1.12
+++ khtml/rendering/render_image.h	2003/10/01 20:55:03
@@ -38,7 +38,7 @@ class DocLoader;
  class RenderImage : public RenderReplaced
  {
  public:
-    RenderImage(DOM::HTMLElementImpl *_element);
+    RenderImage(DOM::NodeImpl*);
      virtual ~RenderImage();

      virtual const char *renderName() const { return "RenderImage"; }
@@ -70,7 +70,7 @@ public:
      virtual short calcReplacedWidth() const;
      virtual int calcReplacedHeight() const;

-    virtual void detach(RenderArena *);
+    virtual void detach();

      // Called to set generated content images (e.g., :before/:after  
generated images).
      void setContentObject(CachedObject* co);
Index: khtml/rendering/render_inline.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_inline.cpp,v
retrieving revision 1.18
diff -u -p -r1.18 khtml/rendering/render_inline.cpp
--- khtml/rendering/render_inline.cpp	2003/09/26 00:57:15	1.18
+++ khtml/rendering/render_inline.cpp	2003/10/01 20:55:03
@@ -26,7 +26,7 @@
  #include "render_arena.h"
  #include "render_inline.h"
  #include "render_block.h"
-#include "xml/dom_nodeimpl.h"
+#include "xml/dom_docimpl.h"

  using namespace khtml;

@@ -88,9 +88,8 @@ void RenderInline::addChildToFlow(Render
          newStyle->inheritFrom(style());
          newStyle->setDisplay(BLOCK);

-        RenderBlock *newBox = new (renderArena()) RenderBlock(0 /*  
anonymous box */);
+        RenderBlock *newBox = new (renderArena())  
RenderBlock(document() /* anonymous box */);
          newBox->setStyle(newStyle);
-        newBox->setIsAnonymousBox(true);
          RenderFlow* oldContinuation = continuation();
          setContinuation(newBox);

@@ -198,7 +197,7 @@ void RenderInline::splitFlow(RenderObjec
      RenderBlock* pre = 0;
      RenderBlock* block = containingBlock();
      bool madeNewBeforeBlock = false;
-    if (block->isAnonymousBox()) {
+    if (block->isAnonymous()) {
          // We can reuse this block and make it the preBlock of the  
next continuation.
          pre = block;
          block = block->containingBlock();
@@ -359,7 +358,7 @@ const char *RenderInline::renderName() c
  {
      if (isRelPositioned())
          return "RenderInline (relative positioned)";
-    if (isAnonymousBox())
+    if (isAnonymous())
          return "RenderInline (anonymous)";
      return "RenderInline";
  }
Index: khtml/rendering/render_list.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_list.cpp,v
retrieving revision 1.45
diff -u -p -r1.45 khtml/rendering/render_list.cpp
--- khtml/rendering/render_list.cpp	2003/09/30 18:47:22	1.45
+++ khtml/rendering/render_list.cpp	2003/10/01 20:55:03
@@ -140,7 +140,7 @@ void RenderListItem::setStyle(RenderStyl
          newStyle->ref();
          newStyle->inheritFrom(style());
          if (!m_marker) {
-            m_marker = new (renderArena()) RenderListMarker();
+            m_marker = new (renderArena())  
RenderListMarker(document());
              m_marker->setStyle(newStyle);
              m_marker->setListItem(this);
              _markerInstalledInParent = false;
@@ -149,7 +149,7 @@ void RenderListItem::setStyle(RenderStyl
              m_marker->setStyle(newStyle);
          newStyle->deref();
      } else if (m_marker) {
-        m_marker->detach(renderArena());
+        m_marker->detach();
          m_marker = 0;
      }
  }
@@ -158,13 +158,13 @@ RenderListItem::~RenderListItem()
  {
  }

-void RenderListItem::detach(RenderArena* renderArena)
+void RenderListItem::detach()
  {
      if (m_marker && !_markerInstalledInParent) {
-        m_marker->detach(renderArena);
+        m_marker->detach();
          m_marker = 0;
      }
-    RenderBlock::detach(renderArena);
+    RenderBlock::detach();
  }

  void RenderListItem::calcListValue()
@@ -232,7 +232,7 @@ void RenderListItem::updateMarkerLocatio
              // then we are the only item in that anonymous box (since  
no line box
              // parent was found).  It's ok to just leave the marker  
where it is
              // in this case.
-            if (markerPar && markerPar->isAnonymousBox())
+            if (markerPar && markerPar->isAnonymous())
                  lineBoxParent = markerPar;
              else
                  lineBoxParent = this;
@@ -291,8 +291,8 @@ void RenderListItem::paintObject(QPainte

  // -----------------------------------------------------------

-RenderListMarker::RenderListMarker()
-    : RenderBox(0), m_listImage(0), m_value(-1)
+RenderListMarker::RenderListMarker(DocumentImpl* document)
+    : RenderBox(document), m_listImage(0), m_value(-1)
  {
      // init RenderObject attributes
      setInline(true);   // our object is Inline
Index: khtml/rendering/render_list.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_list.h,v
retrieving revision 1.17
diff -u -p -r1.17 khtml/rendering/render_list.h
--- khtml/rendering/render_list.h	2003/07/25 20:22:33	1.17
+++ khtml/rendering/render_list.h	2003/10/01 20:55:03
@@ -39,7 +39,7 @@ class RenderListItem;
  class RenderListMarker : public RenderBox
  {
  public:
-    RenderListMarker();
+    RenderListMarker(DOM::DocumentImpl* document);
      ~RenderListMarker();

      virtual void setStyle(RenderStyle *style);
@@ -84,7 +84,7 @@ public:
      RenderListItem(DOM::NodeImpl*);
      virtual ~RenderListItem();

-    virtual void detach(RenderArena *);
+    virtual void detach();

      virtual const char *renderName() const { return "RenderListItem"; }

Index: khtml/rendering/render_object.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_object.cpp,v
retrieving revision 1.100
diff -u -p -r1.100 khtml/rendering/render_object.cpp
--- khtml/rendering/render_object.cpp	2003/09/30 18:45:47	1.100
+++ khtml/rendering/render_object.cpp	2003/10/01 20:55:03
@@ -133,7 +138,7 @@ m_overhangingContents( false ),
  m_relPositioned( false ),
  m_paintBackground( false ),

-m_isAnonymous( false ),
+m_isAnonymous( node == node->getDocument() ),
  m_recalcMinMax( false ),
  m_isText( false ),
  m_inline( true ),
@@ -982,7 +987,7 @@ QString RenderObject::information() cons
      if (isInline()) ts << "il ";
      if (childrenInline()) ts << "ci ";
      if (isFloating()) ts << "fl ";
-    if (isAnonymousBox()) ts << "an ";
+    if (isAnonymous()) ts << "an ";
      if (isRelPositioned()) ts << "rp ";
      if (isPositioned()) ts << "ps ";
      if (overhangingContents()) ts << "oc ";
@@ -1025,7 +1030,7 @@ void RenderObject::printTree(int indent)

  void RenderObject::dump(QTextStream *stream, QString ind) const
  {
-    if (isAnonymousBox()) { *stream << " anonymousBox"; }
+    if (isAnonymous()) { *stream << " anonymous"; }
      if (isFloating()) { *stream << " floating"; }
      if (isPositioned()) { *stream << " positioned"; }
      if (isRelPositioned()) { *stream << " relPositioned"; }
@@ -1061,9 +1066,8 @@ RenderBlock* RenderObject::createAnonymo
      newStyle->inheritFrom(m_style);
      newStyle->setDisplay(BLOCK);

-    RenderBlock *newBox = new (renderArena()) RenderBlock(0 /*  
anonymous box */);
+    RenderBlock *newBox = new (renderArena()) RenderBlock(document()  
/* anonymous box */);
      newBox->setStyle(newStyle);
-    newBox->setIsAnonymousBox(true);
      return newBox;
  }

@@ -1368,25 +1372,29 @@ void RenderObject::removeFromObjectLists
      }
  }

-DOM::DocumentImpl* RenderObject::document() const
-{
-    DOM::NodeImpl* elt = element();
-    RenderObject* current = parent();
-    while (!elt && current) {
-        elt = current->element();
-        current = current->parent();
-    }
-    return elt ? elt->getDocument() : 0;
-}
-
  RenderArena* RenderObject::renderArena() const
  {
      DOM::DocumentImpl* doc = document();
      return doc ? doc->renderArena() : 0;
  }

+void RenderObject::remove()
+{
+    removeFromObjectLists();
+
+    if (parent())
+        //have parent, take care of the tree integrity
+        parent()->removeChild(this);
+}

-void RenderObject::detach(RenderArena* renderArena)
+void RenderObject::detach()
  {
  #ifndef INCREMENTAL_REPAINTING
      // If we're an overflow:hidden object that currently needs layout,  
we need
@@ -1400,10 +1408,8 @@ void RenderObject::detach(RenderArena* r

      remove();

-    m_next = m_previous = 0;
-
      // by default no refcounting
-    arenaDelete(renderArena, this);
+    arenaDelete(document()->renderArena(), this);
  }

  void RenderObject::arenaDelete(RenderArena *arena, void *base)
Index: khtml/rendering/render_object.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_object.h,v
retrieving revision 1.81
diff -u -p -r1.81 khtml/rendering/render_object.h
--- khtml/rendering/render_object.h	2003/09/26 00:57:15	1.81
+++ khtml/rendering/render_object.h	2003/10/01 20:55:03
@@ -34,6 +34,7 @@
  #include "misc/helper.h"
  #include "rendering/render_style.h"
  #include "khtml_events.h"
+#include "xml/dom_nodeimpl.h"

  // Uncomment to turn on incremental repainting.
  // #define INCREMENTAL_REPAINTING 1
@@ -82,7 +83,6 @@ typedef enum {
  namespace DOM {
      class HTMLAreaElementImpl;
      class DOMString;
-    class NodeImpl;
      class DocumentImpl;
      class ElementImpl;
      class EventImpl;
@@ -107,7 +107,8 @@ namespace khtml {
  class RenderObject : public CachedObjectClient
  {
  public:
-
+    // Anonymous objects should pass the document as their node, and  
they will then automatically be
+    // marked as anonymous in the constructor.
      RenderObject(DOM::NodeImpl* node);
      virtual ~RenderObject();

@@ -226,10 +227,10 @@ public:
      virtual bool isTextArea() const { return false; }
      virtual bool isFrameSet() const { return false; }
      virtual bool isApplet() const { return false; }
-
-    bool isAnonymousBox() const { return m_isAnonymous; }
-    void setIsAnonymousBox(bool b) { m_isAnonymous = b; }

+    bool isAnonymous() const { return m_isAnonymous; }
+    void setIsAnonymous(bool b) { m_isAnonymous = b; }
+
      bool isFloating() const { return m_floating; }
      bool isPositioned() const { return m_positioned; } // absolute or  
fixed positioning
      bool isRelPositioned() const { return m_relPositioned; } //  
relative positioning
@@ -253,8 +254,10 @@ public:
      RenderCanvas* canvas() const;

      // don't even think about making this method virtual!
-    DOM::NodeImpl* element() const { return m_node; }
-    DOM::DocumentImpl* document() const;
+    DOM::NodeImpl* element() const { return m_isAnonymous ? 0 :  
m_node; }
+    DOM::DocumentImpl* document() const { return  
m_node->getDocument(); }
+    void setNode(DOM::NodeImpl* node) { m_node = node; }
+    DOM::NodeImpl* node() const { return m_node; }

     /**
       * returns the object containing this one. can be different from  
parent for
@@ -633,7 +636,7 @@ public:
      virtual void calcVerticalMargins() {}
      void removeFromObjectLists();

-    virtual void detach(RenderArena* renderArena);
+    virtual void detach();

      const QFont &font(bool firstLine) const {
  	return style( firstLine )->font();
@@ -658,13 +661,8 @@ protected:
                                       int /*_w*/, int /*_h*/, int  
/*_tx*/, int /*_ty*/) {}

      virtual QRect viewRect() const;
-    void remove() {
-        removeFromObjectLists();

-        if ( parent() )
-            //have parent, take care of the tree integrity
-            parent()->removeChild(this);
-    }
+    void remove();

      void invalidateVerticalPositions();
      short getVerticalPosition( bool firstLine ) const;
@@ -675,9 +673,10 @@ protected:

  private:
      RenderStyle* m_style;
-protected:
-    DOM::NodeImpl* m_node;
+
+    DOM::NodeImpl* m_node;
+
      RenderObject *m_parent;
      RenderObject *m_previous;
      RenderObject *m_next;
Index: khtml/rendering/render_replaced.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_replaced.cpp,v
retrieving revision 1.41
diff -u -p -r1.41 khtml/rendering/render_replaced.cpp
--- khtml/rendering/render_replaced.cpp	2003/09/30 18:39:03	1.41
+++ khtml/rendering/render_replaced.cpp	2003/10/01 20:55:03
@@ -130,7 +130,7 @@ RenderWidget::RenderWidget(DOM::NodeImpl
      ref();
  }

-void RenderWidget::detach(RenderArena* renderArena)
+void RenderWidget::detach()
  {
      remove();

@@ -141,10 +141,10 @@ void RenderWidget::detach(RenderArena* r
          m_widget->removeEventFilter( this );
          m_widget->setMouseTracking( false );
      }
-
-    m_node = 0;
-
-    deref(renderArena);
+
+    RenderArena* arena = renderArena();
+    setNode(0);
+    deref(arena);
  }

  RenderWidget::~RenderWidget()
Index: khtml/rendering/render_replaced.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_replaced.h,v
retrieving revision 1.16
diff -u -p -r1.16 khtml/rendering/render_replaced.h
--- khtml/rendering/render_replaced.h	2003/07/25 20:22:33	1.16
+++ khtml/rendering/render_replaced.h	2003/10/01 20:55:03
@@ -74,7 +74,7 @@ public:

      virtual bool isWidget() const { return true; };

-    virtual void detach(RenderArena* renderArena);
+    virtual void detach();
      virtual void layout( );

      QWidget *widget() const { return m_widget; }
Index: khtml/rendering/render_table.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_table.cpp,v
retrieving revision 1.74
diff -u -p -r1.74 khtml/rendering/render_table.cpp
--- khtml/rendering/render_table.cpp	2003/09/30 18:30:31	1.74
+++ khtml/rendering/render_table.cpp	2003/10/01 20:55:03
@@ -33,6 +33,7 @@
  #include "html/html_tableimpl.h"
  #include "misc/htmltags.h"
  #include "misc/htmlattrs.h"
+#include "xml/dom_docimpl.h"

  #include <kglobal.h>

@@ -143,26 +144,25 @@ void RenderTable::addChild(RenderObject
          break;
      default:
          if ( !beforeChild && lastChild() &&
-	     lastChild()->isTableSection() && lastChild()->isAnonymousBox() )  
{
+	     lastChild()->isTableSection() && lastChild()->isAnonymous() ) {
              o = lastChild();
          } else {
  	    RenderObject *lastBox = beforeChild;
-	    while ( lastBox && lastBox->parent()->isAnonymousBox() &&
+	    while ( lastBox && lastBox->parent()->isAnonymous() &&
  		    !lastBox->isTableSection() && lastBox->style()->display() !=  
TABLE_CAPTION )
  		lastBox = lastBox->parent();
-	    if ( lastBox && lastBox->isAnonymousBox() ) {
+	    if ( lastBox && lastBox->isAnonymous() ) {
  		lastBox->addChild( child, beforeChild );
  		return;
  	    } else {
  		if ( beforeChild && !beforeChild->isTableSection() )
  		    beforeChild = 0;
    		//kdDebug( 6040 ) << this <<" creating anonymous table section  
beforeChild="<< beforeChild << endl;
-		o = new (renderArena()) RenderTableSection(0 /* anonymous */);
+		o = new (renderArena()) RenderTableSection(document() /* anonymous  
*/);
  		RenderStyle *newStyle = new RenderStyle();
  		newStyle->inheritFrom(style());
                  newStyle->setDisplay(TABLE_ROW_GROUP);
  		o->setStyle(newStyle);
-		o->setIsAnonymousBox(true);
  		addChild(o, beforeChild);
  	    }
          }
@@ -711,14 +711,14 @@ RenderTableSection::~RenderTableSection(
      clearGrid();
  }

-void RenderTableSection::detach(RenderArena* arena)
+void RenderTableSection::detach()
  {
      // recalc cell info because RenderTable has unguarded pointers
      // stored that point to this RenderTableSection.
      if (table())
          table()->setNeedSectionRecalc();

-    RenderBox::detach(arena);
+    RenderBox::detach();
  }

  void RenderTableSection::setStyle(RenderStyle* _style)
@@ -750,23 +750,22 @@ void RenderTableSection::addChild(Render
          if( !beforeChild )
              beforeChild = lastChild();

-        if( beforeChild && beforeChild->isAnonymousBox() )
+        if( beforeChild && beforeChild->isAnonymous() )
              row = beforeChild;
          else {
  	    RenderObject *lastBox = beforeChild;
-	    while ( lastBox && lastBox->parent()->isAnonymousBox() &&  
!lastBox->isTableRow() )
+	    while ( lastBox && lastBox->parent()->isAnonymous() &&  
!lastBox->isTableRow() )
  		lastBox = lastBox->parent();
-	    if ( lastBox && lastBox->isAnonymousBox() ) {
+	    if ( lastBox && lastBox->isAnonymous() ) {
  		lastBox->addChild( child, beforeChild );
  		return;
  	    } else {
  		//kdDebug( 6040 ) << "creating anonymous table row" << endl;
-		row = new (renderArena()) RenderTableRow(0 /* anonymous table */);
+		row = new (renderArena()) RenderTableRow(document() /* anonymous  
table */);
  		RenderStyle *newStyle = new RenderStyle();
  		newStyle->inheritFrom(style());
  		newStyle->setDisplay( TABLE_ROW );
  		row->setStyle(newStyle);
-		row->setIsAnonymousBox(true);
  		addChild(row, beforeChild);
  	    }
          }
@@ -1319,13 +1318,13 @@ RenderTableRow::RenderTableRow(DOM::Node
      setInline(false);   // our object is not Inline
  }

-void RenderTableRow::detach(RenderArena* arena)
+void RenderTableRow::detach()
  {
      RenderTableSection *s = section();
      if (s) {
          s->setNeedCellRecalc();
      }
-    RenderContainer::detach(arena);
+    RenderContainer::detach();
  }

  void RenderTableRow::setStyle(RenderStyle* style)
@@ -1352,15 +1351,14 @@ void RenderTableRow::addChild(RenderObje
          if ( !last )
              last = lastChild();
          RenderTableCell *cell = 0;
-        if( last && last->isAnonymousBox() && last->isTableCell() )
+        if( last && last->isAnonymous() && last->isTableCell() )
              cell = static_cast<RenderTableCell *>(last);
          else {
-	    cell = new (renderArena()) RenderTableCell(0 /* anonymous object  
*/);
+	    cell = new (renderArena()) RenderTableCell(document() /*  
anonymous object */);
  	    RenderStyle *newStyle = new RenderStyle();
  	    newStyle->inheritFrom(style());
  	    newStyle->setDisplay( TABLE_CELL );
  	    cell->setStyle(newStyle);
-	    cell->setIsAnonymousBox(true);
  	    addChild(cell, beforeChild);
          }
          cell->addChild(child);
@@ -1443,12 +1441,12 @@ RenderTableCell::RenderTableCell(DOM::No
    m_percentageHeight = 0;
  }

-void RenderTableCell::detach(RenderArena* arena)
+void RenderTableCell::detach()
  {
      if (parent() && section())
          section()->setNeedCellRecalc();

-    RenderBlock::detach(arena);
+    RenderBlock::detach();
  }

  void RenderTableCell::updateFromElement()
Index: khtml/rendering/render_table.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_table.h,v
retrieving revision 1.25
diff -u -p -r1.25 khtml/rendering/render_table.h
--- khtml/rendering/render_table.h	2003/09/26 00:57:15	1.25
+++ khtml/rendering/render_table.h	2003/10/01 20:55:03
@@ -191,7 +191,7 @@ class RenderTableSection : public Render
  public:
      RenderTableSection(DOM::NodeImpl* node);
      ~RenderTableSection();
-    virtual void detach(RenderArena* arena);
+    virtual void detach();

      virtual void setStyle(RenderStyle *style);

@@ -265,7 +265,7 @@ class RenderTableRow : public RenderCont
  public:
      RenderTableRow(DOM::NodeImpl* node);

-    virtual void detach(RenderArena* arena);
+    virtual void detach();

      virtual void setStyle( RenderStyle* );
      virtual const char *renderName() const { return "RenderTableRow"; }
@@ -297,7 +297,7 @@ class RenderTableCell : public RenderBlo
  public:
      RenderTableCell(DOM::NodeImpl* node);

-    virtual void detach(RenderArena* arena);
+    virtual void detach();

      virtual const char *renderName() const { return "RenderTableCell";  
}
      virtual bool isTableCell() const { return true; }
Index: khtml/rendering/render_text.cpp
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_text.cpp,v
retrieving revision 1.82
diff -u -p -r1.82 khtml/rendering/render_text.cpp
--- khtml/rendering/render_text.cpp	2003/09/29 20:27:42	1.82
+++ khtml/rendering/render_text.cpp	2003/10/01 20:55:03
@@ -329,13 +329,13 @@ RenderText::~RenderText()
      if(str) str->deref();
  }

-void RenderText::detach(RenderArena* renderArena)
+void RenderText::detach()
  {
-    deleteRuns(renderArena);
-    RenderObject::detach(renderArena);
+    deleteRuns();
+    RenderObject::detach();
  }

-void RenderText::deleteRuns(RenderArena *arena)
+void RenderText::deleteRuns()
  {
      // this is a slight variant of QArray::clear().
      // We don't delete the array itself here because its
@@ -343,8 +343,7 @@ void RenderText::deleteRuns(RenderArena
      // us resize() calls
      unsigned int len = m_lines.size();
      if (len) {
-        if (!arena)
-            arena = renderArena();
+        RenderArena* arena = renderArena();
          for(unsigned int i=0; i < len; i++) {
              InlineTextBox* s = m_lines.at(i);
              if (s)
Index: khtml/rendering/render_text.h
===================================================================
RCS file:  
/local/home/cvs/Labyrinth/WebCore/khtml/rendering/render_text.h,v
retrieving revision 1.36
diff -u -p -r1.36 khtml/rendering/render_text.h
--- khtml/rendering/render_text.h	2003/09/25 16:51:11	1.36
+++ khtml/rendering/render_text.h	2003/10/01 20:55:03
@@ -53,7 +53,7 @@ public:
          m_toAdd = 0;
      }

-    void detach(RenderArena* renderArena);
+    void detach(RenderArena* arena);

      // Overloaded new operator.  Derived classes must override  
operator new
      // in order to allocate out of the RenderArena.
@@ -131,8 +131,8 @@ public:
      virtual void paintObject(QPainter *, int x, int y, int w, int h,
                               int tx, int ty, PaintAction paintAction);

-    void deleteRuns(RenderArena *renderArena = 0);
-    virtual void detach(RenderArena* renderArena);
+    void deleteRuns();
+    virtual void detach();

      DOM::DOMString data() const { return str; }
      DOM::DOMStringImpl *string() const { return str; }
Index: khtml/xml/dom_docimpl.cpp
===================================================================
RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/xml/dom_docimpl.cpp,v
retrieving revision 1.80
diff -u -p -r1.80 khtml/xml/dom_docimpl.cpp
--- khtml/xml/dom_docimpl.cpp	2003/09/30 18:45:47	1.80
+++ khtml/xml/dom_docimpl.cpp	2003/10/01 20:55:03
@@ -1080,7 +1095,7 @@ void DocumentImpl::detach()
      NodeBaseImpl::detach();

      if ( render )
-        render->detach(m_renderArena);
+        render->detach();

      if (m_paintDevice == m_view)
          setPaintDevice(0);
Index: khtml/xml/dom_nodeimpl.cpp
===================================================================
RCS file: /local/home/cvs/Labyrinth/WebCore/khtml/xml/dom_nodeimpl.cpp,v
retrieving revision 1.39
diff -u -p -r1.39 khtml/xml/dom_nodeimpl.cpp
--- khtml/xml/dom_nodeimpl.cpp	2003/09/30 21:58:06	1.39
+++ khtml/xml/dom_nodeimpl.cpp	2003/10/01 20:55:03
@@ -996,8 +996,8 @@ void NodeImpl::detach()
  {
  //    assert(m_attached);

-    if ( m_render )
-        m_render->detach(getDocument()->renderArena());
+    if (m_render)
+        m_render->detach();

      m_render = 0;
      m_attached = false;




More information about the Khtml-devel mailing list