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