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

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:20:32 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 483c37888fad8206aaa088902b694e2bac6bfbc2
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Jan 21 19:43:50 2003 +0000

            Everything else reviewed by Maciej, dtd.cpp and htmlparser.cpp changes reviewed by Dave.
    
    	- fixed 3151098 -- REGRESSION: Frequent assert about renderer in DOM code
    
            * khtml/html/dtd.cpp: (DOM::checkChild): Disallow text inside colgroup so it can be handled as a special case
    	inside the parser.
            * khtml/html/htmlparser.cpp: (KHTMLParser::insertNode): Discard text inside colgroup and don't pop the colgroup.
    
    	- fixed 3149792 -- memory trasher at robinlionheart.com
    	- fixed 3150664 -- failed assertion in HTMLFrameSetElementImpl::attach on page with frameset inside frameset
    
    	The key to fixing the 3149792 memory trasher was to avoid constructing trees where there
    	is a render object nested inside an object that is not a suitable container. In particular,
    	the code assumed that RenderFlow objects would only be inside other RenderFlow objects, and
    	this does not happen if you have an <object> that is an image, with objects inside it that
    	are intended to be used if the image fails to load.
    
    	The key to fixing the 3150664 assertion was to handle the case where a frame set's parent
    	didn't have a renderer, rather than just asserting about it.
    
            * khtml/rendering/render_flow.cpp:
            (RenderFlow::layout): Added an assertion and a FIXME from Dave's and my review of this code.
            (RenderFlow::splitInlines): Add assertions that we have actual RenderFlow objects. Casting
    	non-RenderFlow objects was the cause of the memory trashing. The other parts of this change
    	assure we never hit these assertions by not creating any render objects for DOM objects
    	that are inside non-RenderFlow.
            (RenderFlow::addChildWithContinuation): Add a similar assertion here.
    
            * khtml/rendering/render_object.h: Declare new member function.
            * khtml/rendering/render_object.cpp: (RenderObject::canHaveChildren): Return false.
            * khtml/rendering/render_container.h: Declare new member function.
            * khtml/rendering/render_container.cpp: (RenderContainer::canHaveChildren): Return true.
            * khtml/rendering/render_replaced.h: Declare new member function.
            * khtml/rendering/render_replaced.cpp: (RenderReplaced::canHaveChildren): Return false.
    
            * khtml/xml/dom_nodeimpl.h: Declare new member functions.
            * khtml/xml/dom_nodeimpl.cpp:
            (NodeImpl::createRendererIfNeeded): Added. Checks to see if a renderer should be created,
    	and creates it if so. The bug fix is checking canHaveChildren() here. This also reduces
    	the amount of repeated code in various attach() methods.
            (NodeImpl::styleForRenderer): Added. Default is parent style.
            (NodeImpl::rendererIsNeeded): Added. Default is to create only if display is not none.
            (NodeImpl::createRenderer): Added. Must never reach this function, but I didn't make it a pure
    	virtual because of subclasses like AttrImpl that don't ever call createRendererIfNeeded.
    	Could rethink this and improve it even more.
    
            * khtml/xml/dom_elementimpl.h: Declare new member functions.
            * khtml/xml/dom_elementimpl.cpp:
            (ElementImpl::styleForRenderer): Override to get the style from the style selector rather
    	than from the parent renderer.
            (ElementImpl::createRenderer): Call RenderObject::createObject to create the right type of renderer.
            (ElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/html/html_baseimpl.h: Declare new member functions.
            * khtml/html/html_baseimpl.cpp:
            (HTMLBodyElementImpl::createRenderer): Create a RenderBody.
            (HTMLBodyElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLFrameElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLFrameElementImpl::createRenderer): Create a RenderFrame.
            (HTMLFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLFrameSetElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLFrameSetElementImpl::createRenderer): Create a RenderFrameSet.
            (HTMLFrameSetElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    	This fixes a bug where the parent doesn't have a renderer; we were asserting in
    	that case rather than just not creating a renderer ourselves, which was wrong.
            (HTMLHtmlElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLHtmlElementImpl::createRenderer): Create a RenderHtml.
            (HTMLHtmlElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLIFrameElementImpl::createRenderer): Create a RenderPartObject.
            (HTMLIFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/html/html_formimpl.h: Declare new member functions.
            * khtml/html/html_formimpl.cpp:
            (HTMLGenericFormElementImpl::attach): Remove now-unneeded code that is handled by
    	createRendererIfNeeded now.
            (HTMLInputElementImpl::rendererIsNeeded): Return false for HIDDEN, otherwise call base.
            (HTMLInputElementImpl::createRenderer): Create the appropriate type of RenderObject.
            (HTMLInputElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    	Determined that we don't need the special case for image buttons any more.
            (HTMLSelectElementImpl::createRenderer): Create a RenderSelect.
            (HTMLSelectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLTextAreaElementImpl::createRenderer): Create a RenderTextArea.
            (HTMLTextAreaElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/html/html_imageimpl.h: Declare new member function.
            * khtml/html/html_imageimpl.cpp:
            (HTMLImageElementImpl::createRenderer): Create a RenderImage.
            (HTMLImageElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/html/html_inlineimpl.h: Declare new member function.
            * khtml/html/html_inlineimpl.cpp:
            (HTMLBRElementImpl::createRenderer): Create a RenderBR.
            (HTMLBRElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/html/html_objectimpl.h: Declare new member functions.
            * khtml/html/html_objectimpl.cpp:
            (HTMLAppletElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLAppletElementImpl::createRenderer): Create either a RenderApplet or RenderEmptyApplet.
            (HTMLAppletElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLEmbedElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLEmbedElementImpl::createRenderer): Create a RenderPartObject.
            (HTMLEmbedElementImpl::attach): Call createRendererIfNeeded to do most of the work.
            (HTMLObjectElementImpl::rendererIsNeeded): Override to implement the different policy
    	this element uses to decide whether to make a renderer (same as old code).
            (HTMLObjectElementImpl::createRenderer): Create either a RenderImage or a RenderPartObject.
            (HTMLObjectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
    
            * khtml/xml/dom_textimpl.h: Declare new member functions.
            * khtml/xml/dom_textimpl.cpp:
            (TextImpl::rendererIsNeeded): Moved logic about not making renderers for only-whitespace
    	elements here. Left out the special case for textarea, since the fact that RenderReplaced
    	returns false from the canHaveChildren function now takes care of that of that case.
            (TextImpl::createRenderer): Create a RenderText.
            (TextImpl::attach): Call createRendererIfNeeded to do most of the work.
    
    	- fixed a buffer overrun that libgmalloc detected
    
            * khtml/misc/decoder.cpp:
            (KanjiCode::judge): Pass in a size parameter instead of using strlen.
            (Decoder::decode): Pass in a size parameter.
    
    	- a little housekeeping
    
            * WebCore.pbproj/project.pbxproj: Remove a bunch of the .moc files
    	from the project. I'm not sure why I put them in originally, but they
    	do no good in there.
            * khtml/khtmlview.moc: Empty out this file.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@3365 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index ead64f3..1af1061 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,138 @@
+2003-01-21  Darin Adler  <darin at apple.com>
+
+        Everything else reviewed by Maciej, dtd.cpp and htmlparser.cpp changes reviewed by Dave.
+
+	- fixed 3151098 -- REGRESSION: Frequent assert about renderer in DOM code
+
+        * khtml/html/dtd.cpp: (DOM::checkChild): Disallow text inside colgroup so it can be handled as a special case
+	inside the parser.
+        * khtml/html/htmlparser.cpp: (KHTMLParser::insertNode): Discard text inside colgroup and don't pop the colgroup.
+
+	- fixed 3149792 -- memory trasher at robinlionheart.com
+	- fixed 3150664 -- failed assertion in HTMLFrameSetElementImpl::attach on page with frameset inside frameset
+
+	The key to fixing the 3149792 memory trasher was to avoid constructing trees where there
+	is a render object nested inside an object that is not a suitable container. In particular,
+	the code assumed that RenderFlow objects would only be inside other RenderFlow objects, and
+	this does not happen if you have an <object> that is an image, with objects inside it that
+	are intended to be used if the image fails to load.
+
+	The key to fixing the 3150664 assertion was to handle the case where a frame set's parent
+	didn't have a renderer, rather than just asserting about it.
+
+        * khtml/rendering/render_flow.cpp:
+        (RenderFlow::layout): Added an assertion and a FIXME from Dave's and my review of this code.
+        (RenderFlow::splitInlines): Add assertions that we have actual RenderFlow objects. Casting
+	non-RenderFlow objects was the cause of the memory trashing. The other parts of this change
+	assure we never hit these assertions by not creating any render objects for DOM objects
+	that are inside non-RenderFlow.
+        (RenderFlow::addChildWithContinuation): Add a similar assertion here.
+
+        * khtml/rendering/render_object.h: Declare new member function.
+        * khtml/rendering/render_object.cpp: (RenderObject::canHaveChildren): Return false.
+        * khtml/rendering/render_container.h: Declare new member function.
+        * khtml/rendering/render_container.cpp: (RenderContainer::canHaveChildren): Return true.
+        * khtml/rendering/render_replaced.h: Declare new member function.
+        * khtml/rendering/render_replaced.cpp: (RenderReplaced::canHaveChildren): Return false.
+
+        * khtml/xml/dom_nodeimpl.h: Declare new member functions.
+        * khtml/xml/dom_nodeimpl.cpp:
+        (NodeImpl::createRendererIfNeeded): Added. Checks to see if a renderer should be created,
+	and creates it if so. The bug fix is checking canHaveChildren() here. This also reduces
+	the amount of repeated code in various attach() methods.
+        (NodeImpl::styleForRenderer): Added. Default is parent style.
+        (NodeImpl::rendererIsNeeded): Added. Default is to create only if display is not none.
+        (NodeImpl::createRenderer): Added. Must never reach this function, but I didn't make it a pure
+	virtual because of subclasses like AttrImpl that don't ever call createRendererIfNeeded.
+	Could rethink this and improve it even more.
+
+        * khtml/xml/dom_elementimpl.h: Declare new member functions.
+        * khtml/xml/dom_elementimpl.cpp:
+        (ElementImpl::styleForRenderer): Override to get the style from the style selector rather
+	than from the parent renderer.
+        (ElementImpl::createRenderer): Call RenderObject::createObject to create the right type of renderer.
+        (ElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_baseimpl.h: Declare new member functions.
+        * khtml/html/html_baseimpl.cpp:
+        (HTMLBodyElementImpl::createRenderer): Create a RenderBody.
+        (HTMLBodyElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLFrameElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLFrameElementImpl::createRenderer): Create a RenderFrame.
+        (HTMLFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLFrameSetElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLFrameSetElementImpl::createRenderer): Create a RenderFrameSet.
+        (HTMLFrameSetElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+	This fixes a bug where the parent doesn't have a renderer; we were asserting in
+	that case rather than just not creating a renderer ourselves, which was wrong.
+        (HTMLHtmlElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLHtmlElementImpl::createRenderer): Create a RenderHtml.
+        (HTMLHtmlElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLIFrameElementImpl::createRenderer): Create a RenderPartObject.
+        (HTMLIFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_formimpl.h: Declare new member functions.
+        * khtml/html/html_formimpl.cpp:
+        (HTMLGenericFormElementImpl::attach): Remove now-unneeded code that is handled by
+	createRendererIfNeeded now.
+        (HTMLInputElementImpl::rendererIsNeeded): Return false for HIDDEN, otherwise call base.
+        (HTMLInputElementImpl::createRenderer): Create the appropriate type of RenderObject.
+        (HTMLInputElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+	Determined that we don't need the special case for image buttons any more.
+        (HTMLSelectElementImpl::createRenderer): Create a RenderSelect.
+        (HTMLSelectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLTextAreaElementImpl::createRenderer): Create a RenderTextArea.
+        (HTMLTextAreaElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_imageimpl.h: Declare new member function.
+        * khtml/html/html_imageimpl.cpp:
+        (HTMLImageElementImpl::createRenderer): Create a RenderImage.
+        (HTMLImageElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_inlineimpl.h: Declare new member function.
+        * khtml/html/html_inlineimpl.cpp:
+        (HTMLBRElementImpl::createRenderer): Create a RenderBR.
+        (HTMLBRElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_objectimpl.h: Declare new member functions.
+        * khtml/html/html_objectimpl.cpp:
+        (HTMLAppletElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLAppletElementImpl::createRenderer): Create either a RenderApplet or RenderEmptyApplet.
+        (HTMLAppletElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLEmbedElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLEmbedElementImpl::createRenderer): Create a RenderPartObject.
+        (HTMLEmbedElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLObjectElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLObjectElementImpl::createRenderer): Create either a RenderImage or a RenderPartObject.
+        (HTMLObjectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/xml/dom_textimpl.h: Declare new member functions.
+        * khtml/xml/dom_textimpl.cpp:
+        (TextImpl::rendererIsNeeded): Moved logic about not making renderers for only-whitespace
+	elements here. Left out the special case for textarea, since the fact that RenderReplaced
+	returns false from the canHaveChildren function now takes care of that of that case.
+        (TextImpl::createRenderer): Create a RenderText.
+        (TextImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+	- fixed a buffer overrun that libgmalloc detected
+
+        * khtml/misc/decoder.cpp:
+        (KanjiCode::judge): Pass in a size parameter instead of using strlen.
+        (Decoder::decode): Pass in a size parameter.
+
+	- a little housekeeping
+
+        * WebCore.pbproj/project.pbxproj: Remove a bunch of the .moc files
+	from the project. I'm not sure why I put them in originally, but they
+	do no good in there.
+        * khtml/khtmlview.moc: Empty out this file.
+
 2003-01-21  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Trey.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index ead64f3..1af1061 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,138 @@
+2003-01-21  Darin Adler  <darin at apple.com>
+
+        Everything else reviewed by Maciej, dtd.cpp and htmlparser.cpp changes reviewed by Dave.
+
+	- fixed 3151098 -- REGRESSION: Frequent assert about renderer in DOM code
+
+        * khtml/html/dtd.cpp: (DOM::checkChild): Disallow text inside colgroup so it can be handled as a special case
+	inside the parser.
+        * khtml/html/htmlparser.cpp: (KHTMLParser::insertNode): Discard text inside colgroup and don't pop the colgroup.
+
+	- fixed 3149792 -- memory trasher at robinlionheart.com
+	- fixed 3150664 -- failed assertion in HTMLFrameSetElementImpl::attach on page with frameset inside frameset
+
+	The key to fixing the 3149792 memory trasher was to avoid constructing trees where there
+	is a render object nested inside an object that is not a suitable container. In particular,
+	the code assumed that RenderFlow objects would only be inside other RenderFlow objects, and
+	this does not happen if you have an <object> that is an image, with objects inside it that
+	are intended to be used if the image fails to load.
+
+	The key to fixing the 3150664 assertion was to handle the case where a frame set's parent
+	didn't have a renderer, rather than just asserting about it.
+
+        * khtml/rendering/render_flow.cpp:
+        (RenderFlow::layout): Added an assertion and a FIXME from Dave's and my review of this code.
+        (RenderFlow::splitInlines): Add assertions that we have actual RenderFlow objects. Casting
+	non-RenderFlow objects was the cause of the memory trashing. The other parts of this change
+	assure we never hit these assertions by not creating any render objects for DOM objects
+	that are inside non-RenderFlow.
+        (RenderFlow::addChildWithContinuation): Add a similar assertion here.
+
+        * khtml/rendering/render_object.h: Declare new member function.
+        * khtml/rendering/render_object.cpp: (RenderObject::canHaveChildren): Return false.
+        * khtml/rendering/render_container.h: Declare new member function.
+        * khtml/rendering/render_container.cpp: (RenderContainer::canHaveChildren): Return true.
+        * khtml/rendering/render_replaced.h: Declare new member function.
+        * khtml/rendering/render_replaced.cpp: (RenderReplaced::canHaveChildren): Return false.
+
+        * khtml/xml/dom_nodeimpl.h: Declare new member functions.
+        * khtml/xml/dom_nodeimpl.cpp:
+        (NodeImpl::createRendererIfNeeded): Added. Checks to see if a renderer should be created,
+	and creates it if so. The bug fix is checking canHaveChildren() here. This also reduces
+	the amount of repeated code in various attach() methods.
+        (NodeImpl::styleForRenderer): Added. Default is parent style.
+        (NodeImpl::rendererIsNeeded): Added. Default is to create only if display is not none.
+        (NodeImpl::createRenderer): Added. Must never reach this function, but I didn't make it a pure
+	virtual because of subclasses like AttrImpl that don't ever call createRendererIfNeeded.
+	Could rethink this and improve it even more.
+
+        * khtml/xml/dom_elementimpl.h: Declare new member functions.
+        * khtml/xml/dom_elementimpl.cpp:
+        (ElementImpl::styleForRenderer): Override to get the style from the style selector rather
+	than from the parent renderer.
+        (ElementImpl::createRenderer): Call RenderObject::createObject to create the right type of renderer.
+        (ElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_baseimpl.h: Declare new member functions.
+        * khtml/html/html_baseimpl.cpp:
+        (HTMLBodyElementImpl::createRenderer): Create a RenderBody.
+        (HTMLBodyElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLFrameElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLFrameElementImpl::createRenderer): Create a RenderFrame.
+        (HTMLFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLFrameSetElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLFrameSetElementImpl::createRenderer): Create a RenderFrameSet.
+        (HTMLFrameSetElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+	This fixes a bug where the parent doesn't have a renderer; we were asserting in
+	that case rather than just not creating a renderer ourselves, which was wrong.
+        (HTMLHtmlElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLHtmlElementImpl::createRenderer): Create a RenderHtml.
+        (HTMLHtmlElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLIFrameElementImpl::createRenderer): Create a RenderPartObject.
+        (HTMLIFrameElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_formimpl.h: Declare new member functions.
+        * khtml/html/html_formimpl.cpp:
+        (HTMLGenericFormElementImpl::attach): Remove now-unneeded code that is handled by
+	createRendererIfNeeded now.
+        (HTMLInputElementImpl::rendererIsNeeded): Return false for HIDDEN, otherwise call base.
+        (HTMLInputElementImpl::createRenderer): Create the appropriate type of RenderObject.
+        (HTMLInputElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+	Determined that we don't need the special case for image buttons any more.
+        (HTMLSelectElementImpl::createRenderer): Create a RenderSelect.
+        (HTMLSelectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLTextAreaElementImpl::createRenderer): Create a RenderTextArea.
+        (HTMLTextAreaElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_imageimpl.h: Declare new member function.
+        * khtml/html/html_imageimpl.cpp:
+        (HTMLImageElementImpl::createRenderer): Create a RenderImage.
+        (HTMLImageElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_inlineimpl.h: Declare new member function.
+        * khtml/html/html_inlineimpl.cpp:
+        (HTMLBRElementImpl::createRenderer): Create a RenderBR.
+        (HTMLBRElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/html/html_objectimpl.h: Declare new member functions.
+        * khtml/html/html_objectimpl.cpp:
+        (HTMLAppletElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLAppletElementImpl::createRenderer): Create either a RenderApplet or RenderEmptyApplet.
+        (HTMLAppletElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLEmbedElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLEmbedElementImpl::createRenderer): Create a RenderPartObject.
+        (HTMLEmbedElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+        (HTMLObjectElementImpl::rendererIsNeeded): Override to implement the different policy
+	this element uses to decide whether to make a renderer (same as old code).
+        (HTMLObjectElementImpl::createRenderer): Create either a RenderImage or a RenderPartObject.
+        (HTMLObjectElementImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+        * khtml/xml/dom_textimpl.h: Declare new member functions.
+        * khtml/xml/dom_textimpl.cpp:
+        (TextImpl::rendererIsNeeded): Moved logic about not making renderers for only-whitespace
+	elements here. Left out the special case for textarea, since the fact that RenderReplaced
+	returns false from the canHaveChildren function now takes care of that of that case.
+        (TextImpl::createRenderer): Create a RenderText.
+        (TextImpl::attach): Call createRendererIfNeeded to do most of the work.
+
+	- fixed a buffer overrun that libgmalloc detected
+
+        * khtml/misc/decoder.cpp:
+        (KanjiCode::judge): Pass in a size parameter instead of using strlen.
+        (Decoder::decode): Pass in a size parameter.
+
+	- a little housekeeping
+
+        * WebCore.pbproj/project.pbxproj: Remove a bunch of the .moc files
+	from the project. I'm not sure why I put them in originally, but they
+	do no good in there.
+        * khtml/khtmlview.moc: Empty out this file.
+
 2003-01-21  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Trey.
diff --git a/WebCore/WebCore.pbproj/project.pbxproj b/WebCore/WebCore.pbproj/project.pbxproj
index ea6a62e..280494d 100644
--- a/WebCore/WebCore.pbproj/project.pbxproj
+++ b/WebCore/WebCore.pbproj/project.pbxproj
@@ -1639,12 +1639,6 @@
 			path = khtml_part.h;
 			refType = 4;
 		};
-		F523D15502DE42AD018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = khtml_part.moc;
-			refType = 4;
-		};
 		F523D15602DE42AD018635CA = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
@@ -1663,12 +1657,6 @@
 			path = khtmlview.h;
 			refType = 4;
 		};
-		F523D15902DE42AD018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = khtmlview.moc;
-			refType = 4;
-		};
 		F523D15A02DE42AD018635CA = {
 			fileRef = F523D15102DE42AD018635CA;
 			isa = PBXBuildFile;
@@ -1725,10 +1713,8 @@
 				F523D15402DE42AD018635CA,
 				F523D15602DE42AD018635CA,
 				F523D15302DE42AD018635CA,
-				F523D15502DE42AD018635CA,
 				F523D15702DE42AD018635CA,
 				F523D15802DE42AD018635CA,
-				F523D15902DE42AD018635CA,
 			);
 			isa = PBXGroup;
 			path = khtml;
@@ -2831,12 +2817,6 @@
 			path = kjs_window.lut.h;
 			refType = 4;
 		};
-		F523D21302DE4369018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = kjs_window.moc;
-			refType = 4;
-		};
 		F523D21402DE4369018635CA = {
 			fileRef = F523D1F402DE4369018635CA;
 			isa = PBXBuildFile;
@@ -3056,7 +3036,6 @@
 				F523D21002DE4369018635CA,
 				F523D21102DE4369018635CA,
 				F523D21202DE4369018635CA,
-				F523D21302DE4369018635CA,
 			);
 			isa = PBXGroup;
 			path = ecma;
@@ -3110,12 +3089,6 @@
 			path = html_documentimpl.h;
 			refType = 4;
 		};
-		F523D23D02DE4396018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = html_documentimpl.moc;
-			refType = 4;
-		};
 		F523D23E02DE4396018635CA = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
@@ -3248,12 +3221,6 @@
 			path = htmltokenizer.h;
 			refType = 4;
 		};
-		F523D25402DE4396018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = htmltokenizer.moc;
-			refType = 4;
-		};
 		F523D25602DE4396018635CA = {
 			fileRef = F523D23502DE4396018635CA;
 			isa = PBXBuildFile;
@@ -3444,7 +3411,6 @@
 				F523D23A02DE4396018635CA,
 				F523D23B02DE4396018635CA,
 				F523D23C02DE4396018635CA,
-				F523D23D02DE4396018635CA,
 				F523D23E02DE4396018635CA,
 				F523D23F02DE4396018635CA,
 				F523D24002DE4396018635CA,
@@ -3467,7 +3433,6 @@
 				F523D25102DE4396018635CA,
 				F523D25202DE4396018635CA,
 				F523D25302DE4396018635CA,
-				F523D25402DE4396018635CA,
 			);
 			isa = PBXGroup;
 			path = html;
@@ -3551,12 +3516,6 @@
 			path = loader.h;
 			refType = 4;
 		};
-		F523D28702DE43D7018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = loader.moc;
-			refType = 4;
-		};
 		F523D28802DE43D7018635CA = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
@@ -3674,7 +3633,6 @@
 				F523D28402DE43D7018635CA,
 				F523D28502DE43D7018635CA,
 				F523D28602DE43D7018635CA,
-				F523D28702DE43D7018635CA,
 				F523D28802DE43D7018635CA,
 				F523D28902DE43D7018635CA,
 				BC7294F703804B3C00A80166,
@@ -4231,12 +4189,6 @@
 			path = dom_docimpl.h;
 			refType = 4;
 		};
-		F523D2F602DE4476018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = dom_docimpl.moc;
-			refType = 4;
-		};
 		F523D2F702DE4476018635CA = {
 			fileEncoding = 30;
 			isa = PBXFileReference;
@@ -4357,12 +4309,6 @@
 			path = xml_tokenizer.h;
 			refType = 4;
 		};
-		F523D30B02DE4476018635CA = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			path = xml_tokenizer.moc;
-			refType = 4;
-		};
 		F523D30C02DE4476018635CA = {
 			fileRef = F523D2F402DE4476018635CA;
 			isa = PBXBuildFile;
@@ -4499,7 +4445,6 @@
 			children = (
 				F523D2F402DE4476018635CA,
 				F523D2F502DE4476018635CA,
-				F523D2F602DE4476018635CA,
 				F523D2F702DE4476018635CA,
 				F523D2F802DE4476018635CA,
 				F523D2F902DE4476018635CA,
@@ -4520,7 +4465,6 @@
 				F523D30802DE4476018635CA,
 				F523D30902DE4476018635CA,
 				F523D30A02DE4476018635CA,
-				F523D30B02DE4476018635CA,
 			);
 			isa = PBXGroup;
 			path = xml;
diff --git a/WebCore/khtml/html/dtd.cpp b/WebCore/khtml/html/dtd.cpp
index 01384ac..c21acb4 100644
--- a/WebCore/khtml/html/dtd.cpp
+++ b/WebCore/khtml/html/dtd.cpp
@@ -733,7 +733,7 @@ bool DOM::checkChild(ushort tagID, ushort childID)
         return false;
     case ID_COLGROUP:
         // COLGROUP: COL *
-        if(childID == ID_COL || childID == ID_TEXT || childID == ID_COMMENT) return true;
+        if(childID == ID_COL || childID == ID_COMMENT) return true;
         return false;
     case ID_TR:
         // TR: _9 +
diff --git a/WebCore/khtml/html/html_baseimpl.cpp b/WebCore/khtml/html/html_baseimpl.cpp
index 1a8788b..49a554f 100644
--- a/WebCore/khtml/html/html_baseimpl.cpp
+++ b/WebCore/khtml/html/html_baseimpl.cpp
@@ -181,22 +181,14 @@ void HTMLBodyElementImpl::init()
     getDocument()->updateStyleSelector();
 }
 
+RenderObject *HTMLBodyElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderBody(this);
+}
+
 void HTMLBodyElementImpl::attach()
 {
-    assert(!m_render);
-    assert(parentNode());
-    
-    if (parentNode()->renderer()) {
-        RenderStyle* style = getDocument()->styleSelector()->styleForElement(this);
-        style->ref();
-        if (style->display() != NONE) {
-            m_render = new (getDocument()->renderArena()) RenderBody(this);
-            m_render->setStyle(style);
-            parentNode()->renderer()->addChild(m_render, nextRenderer());
-        }
-        style->deref();
-    }
-    
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 }
 
@@ -357,24 +349,27 @@ void HTMLFrameElementImpl::init()
     }
 }
 
-void HTMLFrameElementImpl::attach()
+bool HTMLFrameElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!attached());
-    assert(parentNode());
-    
-    // ignore display: none for this element!
-    KHTMLView* w = getDocument()->view();
-    if (isURLAllowed(url) && parentNode()->renderer())  {
-        m_render = new (getDocument()->renderArena()) RenderFrame(this);
-        m_render->setStyle(getDocument()->styleSelector()->styleForElement(this));
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-    }
+    // Ignore display: none.
+    return isURLAllowed(url);
+}
 
+RenderObject *HTMLFrameElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderFrame(this);
+}
+
+void HTMLFrameElementImpl::attach()
+{
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 
     if (!m_render)
         return;
 
+    KHTMLView* w = getDocument()->view();
+
     // we need a unique name for every frame in the frameset. Hope that's unique enough.
     if(name.isEmpty() || w->part()->frameExists( name.string() ) )
       name = DOMString(w->part()->requestFrameName());
@@ -520,23 +515,20 @@ void HTMLFrameSetElementImpl::init()
     }
 }
 
+bool HTMLFrameSetElementImpl::rendererIsNeeded(RenderStyle *style)
+{
+    // Ignore display: none but do pay attention if a stylesheet has caused us to delay our loading.
+    return style->isStyleAvailable();
+}
+
+RenderObject *HTMLFrameSetElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderFrameSet(this);
+}
+
 void HTMLFrameSetElementImpl::attach()
 {
-    assert(!m_render);
-    assert(parentNode());
-    assert(parentNode()->renderer());
-
-    // ignore display: none but do pay attention if a stylesheet has caused us to delay
-    // our loading.
-    RenderStyle* style = getDocument()->styleSelector()->styleForElement(this);
-    style->ref();
-    if (style->isStyleAvailable()) {
-        m_render = new (getDocument()->renderArena()) RenderFrameSet(this);
-        m_render->setStyle(style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-    }
-    style->deref();
-    
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 }
 
@@ -585,16 +577,20 @@ NodeImpl::Id HTMLHeadElementImpl::id() const
     return ID_HEAD;
 }
 
-void HTMLHtmlElementImpl::attach()
+bool HTMLHtmlElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!m_render);
-    assert(parentNode());
-    assert(parentNode()->renderer());
+    // Ignore display: none.
+    return true;
+}
 
-    m_render = new (getDocument()->renderArena()) RenderHtml(this);
-    m_render->setStyle(getDocument()->styleSelector()->styleForElement(this));
-    parentNode()->renderer()->addChild(m_render, nextRenderer());
+RenderObject *HTMLHtmlElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderHtml(this);
+}
 
+void HTMLHtmlElementImpl::attach()
+{
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 }
 
@@ -653,21 +649,20 @@ void HTMLIFrameElementImpl::parseAttribute(AttributeImpl *attr )
   }
 }
 
-void HTMLIFrameElementImpl::attach()
+bool HTMLIFrameElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
+    // Don't ignore display: none the way frame does.
+    return isURLAllowed(url) && style->display() != NONE;
+}
 
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    _style->ref();
-    if (isURLAllowed(url) && parentNode()->renderer() && _style->display() != NONE) {
-        m_render = new (getDocument()->renderArena()) RenderPartObject(this);
-        m_render->setStyle(_style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-    }
-    _style->deref();
+RenderObject *HTMLIFrameElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderPartObject(this);
+}
 
+void HTMLIFrameElementImpl::attach()
+{
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 
     if (m_render) {
diff --git a/WebCore/khtml/html/html_baseimpl.h b/WebCore/khtml/html/html_baseimpl.h
index 98eeec0..90beadb 100644
--- a/WebCore/khtml/html/html_baseimpl.h
+++ b/WebCore/khtml/html/html_baseimpl.h
@@ -59,6 +59,7 @@ public:
     virtual void parseAttribute(AttributeImpl *);
     virtual void init();
     virtual void attach();
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 
     CSSStyleSheetImpl *sheet() const { return m_styleSheet; }
 
@@ -85,6 +86,8 @@ public:
     virtual void parseAttribute(AttributeImpl *);
     virtual void init();
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 
     bool noResize() { return noresize; }
     void setLocation( const DOMString& str );
@@ -133,6 +136,8 @@ public:
     virtual void parseAttribute(AttributeImpl *);
     virtual void init();
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 
     virtual void defaultEventHandler(EventImpl *evt);
 
@@ -182,6 +187,8 @@ public:
 
     virtual Id id() const;
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 };
 
 
@@ -198,6 +205,8 @@ public:
 
     virtual void parseAttribute(AttributeImpl *attr);
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void recalcStyle( StyleChange ch );
 
 protected:
diff --git a/WebCore/khtml/html/html_formimpl.cpp b/WebCore/khtml/html/html_formimpl.cpp
index c6df7ea..3e33f1f 100644
--- a/WebCore/khtml/html/html_formimpl.cpp
+++ b/WebCore/khtml/html/html_formimpl.cpp
@@ -658,11 +658,6 @@ void HTMLGenericFormElementImpl::attach()
 {
     assert(!attached());
 
-    if (m_render) {
-        assert(m_render->style());
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-    }
-
     NodeBaseImpl::attach();
 
     // The call to updateFromElement() needs to go after the call through
@@ -1254,12 +1249,46 @@ void HTMLInputElementImpl::init()
     m_checked = (getAttribute(ATTR_CHECKED) != 0);
 }
 
-void HTMLInputElementImpl::attach()
+bool HTMLInputElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
+    switch(m_type)
+    {
+    case TEXT:
+    case PASSWORD:
+    case ISINDEX:
+    case CHECKBOX:
+    case RADIO:
+    case SUBMIT:
+    case IMAGE:
+    case RESET:
+    case FILE:
+    case BUTTON:   return HTMLGenericFormElementImpl::rendererIsNeeded(style);
+    case HIDDEN:   return false;
+    }
+    assert(false);
+}
+
+RenderObject *HTMLInputElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    switch(m_type)
+    {
+    case TEXT:
+    case PASSWORD:
+    case ISINDEX:  return new (arena) RenderLineEdit(this);
+    case CHECKBOX: return new (arena) RenderCheckBox(this);
+    case RADIO:    return new (arena) RenderRadioButton(this);
+    case SUBMIT:   return new (arena) RenderSubmitButton(this);
+    case IMAGE:    return new (arena) RenderImageButton(this);
+    case RESET:    return new (arena) RenderResetButton(this);
+    case FILE:     return new (arena) RenderFileButton(this);
+    case BUTTON:   return new (arena) RenderPushButton(this);
+    case HIDDEN:   break;
+    }
+    assert(false);
+}
 
+void HTMLInputElementImpl::attach()
+{
     // We had to wait until the attach call to do this, because we don't yet know
     // our type in parseAttribute.  This also has to be done *before* we do
     // styleForElement, or the width info will not get used.  This fixes
@@ -1270,39 +1299,8 @@ void HTMLInputElementImpl::attach()
             addCSSLength(CSS_PROP_WIDTH, width);
     }
     
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    _style->ref();
-    if (parentNode()->renderer() && _style->display() != NONE) {
-        RenderArena* arena = getDocument()->renderArena();
-        switch(m_type)
-        {
-        case TEXT:
-        case PASSWORD:
-        case ISINDEX:  m_render = new (arena) RenderLineEdit(this);     break;
-        case CHECKBOX: m_render = new (arena) RenderCheckBox(this);     break;
-        case RADIO:    m_render = new (arena) RenderRadioButton(this);  break;
-        case SUBMIT:   m_render = new (arena) RenderSubmitButton(this); break;
-        case IMAGE: {
-             m_render =  new (arena) RenderImageButton(this);
-             m_render->setStyle(_style);
-             parentNode()->renderer()->addChild(m_render, nextRenderer());
-             m_render->updateFromElement();
-             NodeBaseImpl::attach();
-             _style->deref();
-             return;
-        }
-        case RESET:    m_render = new (arena) RenderResetButton(this);  break;
-        case FILE:     m_render = new (arena) RenderFileButton(this);   break;
-        case BUTTON:   m_render = new (arena) RenderPushButton(this);   break;
-        case HIDDEN:   break;
-        }
-    }
-
-    if (m_render)
-        m_render->setStyle(_style);
-
+    createRendererIfNeeded();
     HTMLGenericFormElementImpl::attach();
-    _style->deref();
 
 #if APPLE_CHANGES
     // note we don't deal with calling passwordFieldRemoved() on detach, because the timing
@@ -1922,21 +1920,15 @@ void HTMLSelectElementImpl::init()
     addCSSProperty(CSS_PROP_COLOR, "text");
 }
 
-void HTMLSelectElementImpl::attach()
+RenderObject *HTMLSelectElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
 {
-    assert(!attached());
-    assert(parentNode());
-    assert(!renderer());
-
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    _style->ref();
-    if (parentNode()->renderer() && _style->display() != NONE) {
-        m_render = new (getDocument()->renderArena()) RenderSelect(this);
-        m_render->setStyle(_style);
-    }
+    return new (arena) RenderSelect(this);
+}
 
+void HTMLSelectElementImpl::attach()
+{
+    createRendererIfNeeded();
     HTMLGenericFormElementImpl::attach();
-    _style->deref();
 }
 
 bool HTMLSelectElementImpl::encoding(const QTextCodec* codec, khtml::encodingList& encoded_values, bool)
@@ -2430,21 +2422,15 @@ void HTMLTextAreaElementImpl::init()
     addCSSProperty(CSS_PROP_COLOR, "text");
 }
 
-void HTMLTextAreaElementImpl::attach()
+RenderObject *HTMLTextAreaElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
-
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    _style->ref();
-    if (parentNode()->renderer() && _style->display() != NONE) {
-        m_render = new (getDocument()->renderArena()) RenderTextArea(this);
-        m_render->setStyle(_style);
-    }
+    return new (arena) RenderTextArea(this);
+}
 
+void HTMLTextAreaElementImpl::attach()
+{
+    createRendererIfNeeded();
     HTMLGenericFormElementImpl::attach();
-    _style->deref();
 }
 
 bool HTMLTextAreaElementImpl::encoding(const QTextCodec* codec, encodingList& encoding, bool)
diff --git a/WebCore/khtml/html/html_formimpl.h b/WebCore/khtml/html/html_formimpl.h
index 92d26c7..03ccae4 100644
--- a/WebCore/khtml/html/html_formimpl.h
+++ b/WebCore/khtml/html/html_formimpl.h
@@ -296,6 +296,8 @@ public:
 
     virtual void init();
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
 
     virtual bool isSuccessfulSubmitButton() const;
@@ -414,6 +416,7 @@ public:
 
     virtual void init();
     virtual void attach();
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
 
     // get the actual listbox index of the optionIndexth option
@@ -555,6 +558,7 @@ public:
     virtual void parseAttribute(AttributeImpl *attr);
     virtual void init();
     virtual void attach();
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual bool encoding(const QTextCodec*, khtml::encodingList&, bool);
     virtual void reset();
     DOMString value();
diff --git a/WebCore/khtml/html/html_imageimpl.cpp b/WebCore/khtml/html/html_imageimpl.cpp
index b4fc098..d46cedd 100644
--- a/WebCore/khtml/html/html_imageimpl.cpp
+++ b/WebCore/khtml/html/html_imageimpl.cpp
@@ -184,30 +184,24 @@ DOMString HTMLImageElementImpl::altText() const
     return alt;
 }
 
-void HTMLImageElementImpl::attach()
+RenderObject *HTMLImageElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
+     return new (arena) RenderImage(this);
+}
 
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    _style->ref();
+void HTMLImageElementImpl::attach()
+{
+    createRendererIfNeeded();
 
-    if (parentNode()->renderer() && _style->display() != NONE) {
-        m_render = new (getDocument()->renderArena()) RenderImage(this);
-        m_render->setStyle(_style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
+    if (m_render) {
         m_render->updateFromElement();
+        if (getDocument()->isHTMLDocument()) {
+            HTMLDocumentImpl *document = static_cast<HTMLDocumentImpl *>(getDocument());
+            document->addNamedImageOrForm(oldIdAttr);
+            document->addNamedImageOrForm(oldNameAttr);
+        }
     }
 
-    if (getDocument()->isHTMLDocument() && _style->display() != NONE) {
-	HTMLDocumentImpl *document = static_cast<HTMLDocumentImpl *>(getDocument());
-	document->addNamedImageOrForm(oldIdAttr);
-	document->addNamedImageOrForm(oldNameAttr);
-    }
-
-    _style->deref();
-
     NodeBaseImpl::attach();
 }
 
diff --git a/WebCore/khtml/html/html_imageimpl.h b/WebCore/khtml/html/html_imageimpl.h
index d42e13e..b921e91 100644
--- a/WebCore/khtml/html/html_imageimpl.h
+++ b/WebCore/khtml/html/html_imageimpl.h
@@ -46,6 +46,7 @@ public:
     virtual void parseAttribute(AttributeImpl *);
 
     virtual void attach();
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void detach();
 
     long width() const;
diff --git a/WebCore/khtml/html/html_inlineimpl.cpp b/WebCore/khtml/html/html_inlineimpl.cpp
index 3055234..c7b9ba9 100644
--- a/WebCore/khtml/html/html_inlineimpl.cpp
+++ b/WebCore/khtml/html/html_inlineimpl.cpp
@@ -214,24 +214,14 @@ void HTMLBRElementImpl::parseAttribute(AttributeImpl *attr)
     }
 }
 
+RenderObject *HTMLBRElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+     return new (arena) RenderBR(this);
+}
+
 void HTMLBRElementImpl::attach()
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
-
-    RenderObject *parentRenderer = parentNode()->renderer();
-    if (parentRenderer) {
-        RenderStyle *style = getDocument()->styleSelector()->styleForElement(this);
-        style->ref();
-        if (style->display() != NONE) {
-            m_render = new (getDocument()->renderArena()) RenderBR(this);
-            m_render->setStyle(style);
-            parentRenderer->addChild(m_render, nextRenderer());
-        }
-        style->deref();
-    }
-    
+    createRendererIfNeeded();
     NodeImpl::attach();
 }
 
diff --git a/WebCore/khtml/html/html_inlineimpl.h b/WebCore/khtml/html/html_inlineimpl.h
index 6015d55..b8c8e60 100644
--- a/WebCore/khtml/html/html_inlineimpl.h
+++ b/WebCore/khtml/html/html_inlineimpl.h
@@ -57,6 +57,7 @@ public:
     virtual Id id() const;
     virtual void parseAttribute(AttributeImpl *attr);
     virtual void attach();
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 };
 
 // -------------------------------------------------------------------------
diff --git a/WebCore/khtml/html/html_objectimpl.cpp b/WebCore/khtml/html/html_objectimpl.cpp
index a1bae96..c0ebe96 100644
--- a/WebCore/khtml/html/html_objectimpl.cpp
+++ b/WebCore/khtml/html/html_objectimpl.cpp
@@ -91,16 +91,16 @@ void HTMLAppletElementImpl::parseAttribute(AttributeImpl *attr)
     }
 }
 
-void HTMLAppletElementImpl::attach()
+bool HTMLAppletElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    if (!parentNode()->renderer() || getAttribute(ATTR_CODE).isNull()) {
-        NodeBaseImpl::attach();
-        return;
-    }
+    return !getAttribute(ATTR_CODE).isNull();
+}
 
+RenderObject *HTMLAppletElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+#ifndef Q_WS_QWS // FIXME(E)? I don't think this is possible with Qt Embedded...
     KHTMLView *view = getDocument()->view();
 
-#ifndef Q_WS_QWS // FIXME(E)? I don't think this is possible with Qt Embedded...
     if( view->part()->javaEnabled() )
     {
 	QMap<QString, QString> args;
@@ -118,19 +118,20 @@ void HTMLAppletElementImpl::attach()
 	    args.insert( "archive", archive.string() );
 
 	args.insert( "baseURL", getDocument()->baseURL() );
-        m_render = new (getDocument()->renderArena()) RenderApplet(this, args);
+        return new (getDocument()->renderArena()) RenderApplet(this, args);
     }
-    else
-        // ### remove me. we should never show an empty applet, instead
-        // render the alternative content given by the webpage
-        m_render = new (getDocument()->renderArena()) RenderEmptyApplet(this);
-#endif
 
-    if (m_render) {
-        m_render->setStyle(getDocument()->styleSelector()->styleForElement(this));
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-    }
+    // ### remove me. we should never show an empty applet, instead
+    // render the alternative content given by the webpage
+    return new (getDocument()->renderArena()) RenderEmptyApplet(this);
+#else
+    return 0;
+#endif
+}
 
+void HTMLAppletElementImpl::attach()
+{
+    createRendererIfNeeded();
     NodeBaseImpl::attach();
 }
 
@@ -240,25 +241,23 @@ void HTMLEmbedElementImpl::parseAttribute(AttributeImpl *attr)
   }
 }
 
-void HTMLEmbedElementImpl::attach()
+bool HTMLEmbedElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-
-    if (parentNode()->renderer()) {
-        KHTMLView* w = getDocument()->view();
-        if (w->part()->pluginsEnabled()) {
-            if (parentNode()->id() != ID_OBJECT)
-                m_render = new (getDocument()->renderArena()) RenderPartObject(this);
-        }
+    KHTMLView* w = getDocument()->view();
+    return w->part()->pluginsEnabled() && parentNode()->id() != ID_OBJECT;
+}
 
-        if (m_render) {
-            m_render->setStyle(getDocument()->styleSelector()->styleForElement(this));
-            parentNode()->renderer()->addChild(m_render, nextRenderer());
-            static_cast<RenderPartObject*>(m_render)->updateWidget();
-        }
-    }
+RenderObject *HTMLEmbedElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderPartObject(this);
+}
 
+void HTMLEmbedElementImpl::attach()
+{
+    createRendererIfNeeded();
+    if (m_render) {
+        static_cast<RenderPartObject*>(m_render)->updateWidget();
+    }
     NodeBaseImpl::attach();
 }
 
@@ -330,51 +329,51 @@ DocumentImpl* HTMLObjectElementImpl::contentDocument() const
     return 0;
 }
 
-void HTMLObjectElementImpl::attach()
+bool HTMLObjectElementImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!attached());
-    assert(!m_render);
-    
+    if (serviceType.startsWith("image/")) {
+        return HTMLElementImpl::rendererIsNeeded(style);
+    }
+
     KHTMLView* w = getDocument()->view();
-    bool loadplugin = w->part()->pluginsEnabled();
-    RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-    
-    _style->ref();
-    
-    if(serviceType.startsWith("image/") && parentNode()->renderer() && _style->display() != NONE){
-        m_render = new (getDocument()->renderArena()) RenderImage(this);
-        m_render->setStyle(_style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
-        m_render->updateFromElement();
-        loadplugin = false;
+    if (!w->part()->pluginsEnabled()) {
+        return false;
     }
-    
 #if APPLE_CHANGES
-    // This check showed up during the KDE 3.0 -> 3.0.1 transition.
-    // We can't figure out exactly what it's supposed to do, but it prevents
-    // plugins from working properly for us, so we've rolled back to the way
-    // it was in KDE 3.0.1.
+    // Eventually we will merge with the better version of this check on the tip of tree.
+    // Until then, just leave it out.
 #else
     KURL u = getDocument()->completeURL(url);
     for (KHTMLPart* part = w->part()->parentPart(); part; part = part->parentPart())
         if (part->url() == u) {
-            loadplugin = false;
-            break;
+            return false;
         }
 #endif
+    return true;
+}
 
-    // If we are already cleared, then it means that we were attach()-ed previously
-    // with no renderer.  We will actually need to do an update in order to ensure
-    // that the plugin shows up.  This fix is necessary to work with async
-    // render tree construction caused by stylesheet loads. -dwh
-    if (loadplugin && parentNode()->renderer()) {
-        needWidgetUpdate = false;
-        m_render = new (getDocument()->renderArena()) RenderPartObject(this);
-        m_render->setStyle(_style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
+RenderObject *HTMLObjectElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    if (serviceType.startsWith("image/")) {
+        return new (arena) RenderImage(this);
     }
+    return new (arena) RenderPartObject(this);
+}
 
-    _style->deref();
+void HTMLObjectElementImpl::attach()
+{
+    createRendererIfNeeded();
+    if (m_render) {
+        if (serviceType.startsWith("image/")) {
+            m_render->updateFromElement();
+        } else {
+            // If we are already cleared, then it means that we were attach()-ed previously
+            // with no renderer. We will actually need to do an update in order to ensure
+            // that the plugin shows up.  This fix is necessary to work with async
+            // render tree construction caused by stylesheet loads. -dwh
+            needWidgetUpdate = false;
+        }
+    }
 
     NodeBaseImpl::attach();
 
diff --git a/WebCore/khtml/html/html_objectimpl.h b/WebCore/khtml/html/html_objectimpl.h
index e54d28a..d89bcf2 100644
--- a/WebCore/khtml/html/html_objectimpl.h
+++ b/WebCore/khtml/html/html_objectimpl.h
@@ -48,6 +48,8 @@ public:
 
     virtual void parseAttribute(AttributeImpl *token);
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 
     bool getMember(const QString &, JType &, QString &);
     bool callMember(const QString &, const QStringList &, JType &, QString &);
@@ -69,6 +71,8 @@ public:
     virtual void parseAttribute(AttributeImpl *attr);
 
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
 
     QString url;
     QString pluginPage;
@@ -92,6 +96,8 @@ public:
     virtual void parseAttribute(AttributeImpl *token);
 
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void detach();
 
     virtual void recalcStyle( StyleChange ch );
diff --git a/WebCore/khtml/html/htmlparser.cpp b/WebCore/khtml/html/htmlparser.cpp
index 5640548..29076d3 100644
--- a/WebCore/khtml/html/htmlparser.cpp
+++ b/WebCore/khtml/html/htmlparser.cpp
@@ -742,8 +742,10 @@ bool KHTMLParser::insertNode(NodeImpl *n, bool flat)
             handled = true;
             break;
         case ID_COLGROUP:
-            popBlock(ID_COLGROUP);
-            handled = true;
+            if (id != ID_TEXT) {
+                popBlock(ID_COLGROUP);
+                handled = true;
+            }
             break;
         case ID_FONT:
             popBlock(ID_FONT);
diff --git a/WebCore/khtml/khtmlview.moc b/WebCore/khtml/khtmlview.moc
index 4055f1f..e69de29 100644
--- a/WebCore/khtml/khtmlview.moc
+++ b/WebCore/khtml/khtmlview.moc
@@ -1 +0,0 @@
-#include <khtmlview.h>
diff --git a/WebCore/khtml/misc/decoder.cpp b/WebCore/khtml/misc/decoder.cpp
index 572013a..603ebcf 100644
--- a/WebCore/khtml/misc/decoder.cpp
+++ b/WebCore/khtml/misc/decoder.cpp
@@ -45,7 +45,7 @@ class KanjiCode
 {
 public:
     enum Type {ASCII, JIS, EUC, SJIS, UNICODE, UTF8 };
-    static enum Type judge(const char *str);
+    static enum Type judge(const char *str, int length);
     static const int ESC;
     static const int _SS2_;
     static const unsigned char kanji_map_sjis[];
@@ -113,7 +113,7 @@ const unsigned char KanjiCode::kanji_map_sjis[] =
  * But it fails detection. It's not useful.
  */
 
-enum KanjiCode::Type KanjiCode::judge(const char *str)
+enum KanjiCode::Type KanjiCode::judge(const char *str, int size)
 {
     enum Type code;
     int i;
@@ -123,7 +123,6 @@ enum KanjiCode::Type KanjiCode::judge(const char *str)
     int euc = 0;
 
     const unsigned char *ptr = (const unsigned char *) str;
-    int size = strlen(str);
 
     code = ASCII;
 
@@ -488,7 +487,7 @@ QString Decoder::decode(const char *data, int len)
 #ifdef DECODE_DEBUG
 	kdDebug( 6005 ) << "Decoder: use auto-detect (" << strlen(data) << ")" << endl;
 #endif
-	switch ( KanjiCode::judge( data ) ) {
+	switch ( KanjiCode::judge( data, len ) ) {
 	case KanjiCode::JIS:
 	    enc = "jis7";
 	    break;
diff --git a/WebCore/khtml/rendering/render_container.cpp b/WebCore/khtml/rendering/render_container.cpp
index c5d952c..0d0aa58 100644
--- a/WebCore/khtml/rendering/render_container.cpp
+++ b/WebCore/khtml/rendering/render_container.cpp
@@ -66,6 +66,11 @@ void RenderContainer::detach(RenderArena* renderArena)
     RenderObject::detach(renderArena);
 }
 
+bool RenderContainer::canHaveChildren() const
+{
+    return true;
+}
+
 void RenderContainer::addChild(RenderObject *newChild, RenderObject *beforeChild)
 {
 #ifdef DEBUG_LAYOUT
diff --git a/WebCore/khtml/rendering/render_container.h b/WebCore/khtml/rendering/render_container.h
index 0fbf19b..30969da 100644
--- a/WebCore/khtml/rendering/render_container.h
+++ b/WebCore/khtml/rendering/render_container.h
@@ -40,6 +40,7 @@ public:
     RenderObject *firstChild() const { return m_first; }
     RenderObject *lastChild() const { return m_last; }
 
+    virtual bool canHaveChildren() const;
     virtual void addChild(RenderObject *newChild, RenderObject *beforeChild = 0);
     virtual void removeChild(RenderObject *oldChild);
 
diff --git a/WebCore/khtml/rendering/render_flow.cpp b/WebCore/khtml/rendering/render_flow.cpp
index 0d91653..d442ba6 100644
--- a/WebCore/khtml/rendering/render_flow.cpp
+++ b/WebCore/khtml/rendering/render_flow.cpp
@@ -337,7 +337,9 @@ void RenderFlow::layout()
         // Table cells need to grow to accommodate both overhanging floats and
         // blocks that have overflowed content.
         // Check for an overhanging float first.
+        // FIXME: This needs to look at the last flow, not the last child.
         if (lastChild() && lastChild()->hasOverhangingFloats() ) {
+            KHTMLAssert(lastChild()->isFlow());
             m_height = lastChild()->yPos() + static_cast<RenderFlow*>(lastChild())->floatBottom();
             m_height += borderBottom() + paddingBottom();
         }
@@ -1826,6 +1828,7 @@ void RenderFlow::splitInlines(RenderFlow* fromBlock, RenderFlow* toBlock,
     // We have been reparented and are now under the fromBlock.  We need
     // to walk up our inline parent chain until we hit the containing block.
     // Once we hit the containing block we're done.
+    KHTMLAssert(parent()->isFlow());
     RenderFlow* curr = static_cast<RenderFlow*>(parent());
     RenderFlow* currChild = this;
     while (curr && curr != fromBlock) {
@@ -1854,6 +1857,7 @@ void RenderFlow::splitInlines(RenderFlow* fromBlock, RenderFlow* toBlock,
         
         // Keep walking up the chain.
         currChild = curr;
+        KHTMLAssert(curr->parent()->isFlow());
         curr = static_cast<RenderFlow*>(curr->parent());
     }
   
@@ -1940,6 +1944,7 @@ void RenderFlow::splitFlow(RenderObject* beforeChild, RenderFlow* newBlockBox,
 void RenderFlow::addChildWithContinuation(RenderObject* newChild, RenderObject* beforeChild)
 {
     RenderFlow* flow = continuationBefore(beforeChild);
+    KHTMLAssert(!beforeChild || beforeChild->parent()->isFlow());
     RenderFlow* beforeChildParent = beforeChild ? static_cast<RenderFlow*>(beforeChild->parent()) : 
                                     (flow->continuation() ? flow->continuation() : flow);
     
diff --git a/WebCore/khtml/rendering/render_object.cpp b/WebCore/khtml/rendering/render_object.cpp
index cad022d..f8a68d0 100644
--- a/WebCore/khtml/rendering/render_object.cpp
+++ b/WebCore/khtml/rendering/render_object.cpp
@@ -154,6 +154,10 @@ RenderObject::~RenderObject()
         m_style->deref();
 }
 
+bool RenderObject::canHaveChildren() const
+{
+    return false;
+}
 
 void RenderObject::addChild(RenderObject* , RenderObject *)
 {
diff --git a/WebCore/khtml/rendering/render_object.h b/WebCore/khtml/rendering/render_object.h
index e9d3fad..ea0f810 100644
--- a/WebCore/khtml/rendering/render_object.h
+++ b/WebCore/khtml/rendering/render_object.h
@@ -120,6 +120,7 @@ public:
     
     // RenderObject tree manipulation
     //////////////////////////////////////////
+    virtual bool canHaveChildren() const;
     virtual void addChild(RenderObject *newChild, RenderObject *beforeChild = 0);
     virtual void removeChild(RenderObject *oldChild);
 
diff --git a/WebCore/khtml/rendering/render_replaced.cpp b/WebCore/khtml/rendering/render_replaced.cpp
index 3a07307..55da802 100644
--- a/WebCore/khtml/rendering/render_replaced.cpp
+++ b/WebCore/khtml/rendering/render_replaced.cpp
@@ -113,6 +113,12 @@ void RenderReplaced::position(int x, int y, int, int, int, bool, bool, int)
     m_y = y + marginTop();
 }
 
+bool RenderReplaced::canHaveChildren() const
+{
+    // We should not really be a RenderContainer subclass.
+    return false;
+}
+
 // -----------------------------------------------------------------------------
 
 RenderWidget::RenderWidget(DOM::NodeImpl* node)
diff --git a/WebCore/khtml/rendering/render_replaced.h b/WebCore/khtml/rendering/render_replaced.h
index 1c876df..8e5eac5 100644
--- a/WebCore/khtml/rendering/render_replaced.h
+++ b/WebCore/khtml/rendering/render_replaced.h
@@ -55,6 +55,8 @@ public:
     void setIntrinsicHeight(int h) { m_intrinsicHeight = h; }
 
     virtual void position(int x, int y, int from, int len, int width, bool reverse, bool firstLine, int);
+    
+    virtual bool canHaveChildren() const;
 
 private:
     short m_intrinsicWidth;
diff --git a/WebCore/khtml/rendering/render_table.cpp b/WebCore/khtml/rendering/render_table.cpp
index 557c5e3..d461537 100644
--- a/WebCore/khtml/rendering/render_table.cpp
+++ b/WebCore/khtml/rendering/render_table.cpp
@@ -1611,9 +1611,10 @@ void RenderTableCol::addChild(RenderObject *child, RenderObject *beforeChild)
     //                   (beforeChild ? beforeChild->renderName() : 0) << " )" << endl;
 #endif
 
-    if (child->style()->display() == TABLE_COLUMN)
-        // these have to come before the table definition!
-        RenderContainer::addChild(child,beforeChild);
+    KHTMLAssert(child->style()->display() == TABLE_COLUMN);
+
+    // these have to come before the table definition!
+    RenderContainer::addChild(child,beforeChild);
 }
 
 #ifndef NDEBUG
diff --git a/WebCore/khtml/xml/dom_elementimpl.cpp b/WebCore/khtml/xml/dom_elementimpl.cpp
index b121bcb..bd6b32d 100644
--- a/WebCore/khtml/xml/dom_elementimpl.cpp
+++ b/WebCore/khtml/xml/dom_elementimpl.cpp
@@ -307,23 +307,21 @@ NamedAttrMapImpl* ElementImpl::defaultMap() const
     return 0;
 }
 
-void ElementImpl::attach()
+RenderStyle *ElementImpl::styleForRenderer(RenderObject *parentRenderer)
 {
-    assert(!attached());
-    assert(!m_render);
-    assert(parentNode());
+    return getDocument()->styleSelector()->styleForElement(this);
+}
+
+RenderObject *ElementImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return RenderObject::createObject(this, style);
+}
 
+void ElementImpl::attach()
+{
 #if SPEED_DEBUG < 1
-    if (parentNode()->renderer()) {
-        RenderStyle* _style = getDocument()->styleSelector()->styleForElement(this);
-        _style->ref();
-        m_render = RenderObject::createObject(this, _style);
-        if(m_render)
-            parentNode()->renderer()->addChild(m_render, nextRenderer());
-        _style->deref();
-    }
+    createRendererIfNeeded();
 #endif
-
     NodeBaseImpl::attach();
 }
 
diff --git a/WebCore/khtml/xml/dom_elementimpl.h b/WebCore/khtml/xml/dom_elementimpl.h
index db23604..06c253f 100644
--- a/WebCore/khtml/xml/dom_elementimpl.h
+++ b/WebCore/khtml/xml/dom_elementimpl.h
@@ -192,6 +192,8 @@ public:
     virtual QString state() { return QString::null; }
 
     virtual void attach();
+    virtual khtml::RenderStyle *styleForRenderer(khtml::RenderObject *parent);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void recalcStyle( StyleChange = NoChange );
 
     virtual void mouseEventHandler( MouseEvent */*ev*/, bool /*inside*/ ) {};
diff --git a/WebCore/khtml/xml/dom_nodeimpl.cpp b/WebCore/khtml/xml/dom_nodeimpl.cpp
index bd9cbfa..59ed3f6 100644
--- a/WebCore/khtml/xml/dom_nodeimpl.cpp
+++ b/WebCore/khtml/xml/dom_nodeimpl.cpp
@@ -31,6 +31,7 @@
 #include "xml/dom2_eventsimpl.h"
 #include "xml/dom_docimpl.h"
 #include "xml/dom_nodeimpl.h"
+#include "css/cssstyleselector.h"
 
 #include <kglobal.h>
 #include <kdebug.h>
@@ -1017,6 +1018,42 @@ RenderObject * NodeImpl::nextRenderer()
     return 0;
 }
 
+void NodeImpl::createRendererIfNeeded()
+{
+    assert(!attached());
+    assert(!m_render);
+    
+    NodeImpl *parent = parentNode();    
+    assert(parent);
+    
+    RenderObject *parentRenderer = parent->renderer();
+    if (parentRenderer && parentRenderer->canHaveChildren()) {
+        RenderStyle *style = styleForRenderer(parentRenderer);
+        style->ref();
+        if (rendererIsNeeded(style)) {
+            m_render = createRenderer(getDocument()->renderArena(), style);
+            m_render->setStyle(style);
+            parentRenderer->addChild(m_render, nextRenderer());
+        }
+        style->deref();
+    }
+}
+
+RenderStyle *NodeImpl::styleForRenderer(RenderObject *parent)
+{
+    return parent->style();
+}
+
+bool NodeImpl::rendererIsNeeded(RenderStyle *style)
+{
+    return style->display() != NONE;
+}
+
+RenderObject *NodeImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    assert(false);
+}
+
 //-------------------------------------------------------------------------
 
 NodeBaseImpl::NodeBaseImpl(DocumentPtr *doc)
diff --git a/WebCore/khtml/xml/dom_nodeimpl.h b/WebCore/khtml/xml/dom_nodeimpl.h
index 2e4be78..776312c 100644
--- a/WebCore/khtml/xml/dom_nodeimpl.h
+++ b/WebCore/khtml/xml/dom_nodeimpl.h
@@ -37,6 +37,7 @@
 class QPainter;
 template <class type> class QPtrList;
 class KHTMLView;
+class RenderArena;
 class QRect;
 class QMouseEvent;
 class QKeyEvent;
@@ -44,8 +45,8 @@ class QTextStream;
 class QStringList;
 
 namespace khtml {
-    class RenderStyle;
     class RenderObject;
+    class RenderStyle;
 };
 
 namespace DOM {
@@ -310,6 +311,11 @@ public:
 
     void closeRenderer();
 
+    void createRendererIfNeeded();
+    virtual khtml::RenderStyle *styleForRenderer(khtml::RenderObject *parent);
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
+
     // -----------------------------------------------------------------------------
     // Methods for maintaining the state of the element between history navigation
 
@@ -366,11 +372,7 @@ public:
      * node that is of the type CDATA_SECTION_NODE, TEXT_NODE or COMMENT_NODE has changed it's value.
      */
     virtual void childrenChanged();
-
-#if APPLE_CHANGES
-    static Node nodeInstance(NodeImpl *impl);
-#endif
-
+    
 private: // members
     DocumentPtr *document;
     NodeImpl *m_previous;
diff --git a/WebCore/khtml/xml/dom_textimpl.cpp b/WebCore/khtml/xml/dom_textimpl.cpp
index 7a99167..cf798ec 100644
--- a/WebCore/khtml/xml/dom_textimpl.cpp
+++ b/WebCore/khtml/xml/dom_textimpl.cpp
@@ -357,47 +357,58 @@ NodeImpl *TextImpl::cloneNode(bool /*deep*/)
     return getDocument()->createTextNode(str);
 }
 
-void TextImpl::attach()
+bool TextImpl::rendererIsNeeded(RenderStyle *style)
 {
-    assert(!m_render);
-    assert(!attached());
-    assert(parentNode() && parentNode()->isElementNode());
-
-    ElementImpl* element = static_cast<ElementImpl*>(parentNode());
-    if (!m_render && element->renderer() && !element->renderer()->isTextArea()) {
-        RenderObject* par = element->renderer();
-        khtml::RenderStyle* _style = par->style();
-        bool onlyWS = containsOnlyWhitespace();
-        if (onlyWS) {
-            if (par->isTable() || par->isTableRow() || par->isTableSection())
-                return CharacterDataImpl::attach();
-            
-            if (par->isInline() && _style->whiteSpace() != PRE) {
-                // <span><div/> <div/></span>
-                RenderObject* prevRender = previousRenderer();
-                if (prevRender && prevRender->isFlow() && !prevRender->isInline())
-                    return CharacterDataImpl::attach();
-            }
-            else if (!par->isInline() && _style->whiteSpace() != PRE) {
-                RenderObject* prevRender = previousRenderer();
-                if (par->isFlow() && !par->childrenInline() && 
-                    (!prevRender || !prevRender->isInline()))
-                    return CharacterDataImpl::attach();
-                
-                RenderObject* nextRender = nextRenderer();
-                if ((!par->firstChild() || 
-                    nextRender == par->firstChild()))
-                    // Whitespace at the start of a block just goes away.  Don't even
-                    // make a render object for this text.
-                    return CharacterDataImpl::attach();
-            }
+    if (!CharacterDataImpl::rendererIsNeeded(style)) {
+        return false;
+    }
+    bool onlyWS = containsOnlyWhitespace();
+    if (!onlyWS) {
+        return true;
+    }
+    
+    RenderObject *par = parentNode()->renderer();
+    
+    if (par->isTable() || par->isTableRow() || par->isTableSection()) {
+        return false;
+    }
+    
+    if (style->whiteSpace() == PRE) {
+        return true;
+    }
+    
+    if (par->isInline()) {
+        // <span><div/> <div/></span>
+        RenderObject *prev = previousRenderer();
+        if (prev && prev->isFlow() && !prev->isInline()) {
+            return false;
+        }
+    } else {
+        RenderObject *prev = previousRenderer();
+        if (par->isFlow() && !par->childrenInline() && (!prev || !prev->isInline())) {
+            return false;
+        }
+        
+        RenderObject *first = par->firstChild();
+        RenderObject *next = nextRenderer();
+        if (!first || next == first) {
+            // Whitespace at the start of a block just goes away.  Don't even
+            // make a render object for this text.
+            return false;
         }
-
-        m_render = new (getDocument()->renderArena()) RenderText(this, str);
-        m_render->setStyle(_style);
-        parentNode()->renderer()->addChild(m_render, nextRenderer());
     }
+    
+    return true;
+}
 
+RenderObject *TextImpl::createRenderer(RenderArena *arena, RenderStyle *style)
+{
+    return new (arena) RenderText(this, str);
+}
+
+void TextImpl::attach()
+{
+    createRendererIfNeeded();
     CharacterDataImpl::attach();
 }
 
diff --git a/WebCore/khtml/xml/dom_textimpl.h b/WebCore/khtml/xml/dom_textimpl.h
index a688433..378913c 100644
--- a/WebCore/khtml/xml/dom_textimpl.h
+++ b/WebCore/khtml/xml/dom_textimpl.h
@@ -123,6 +123,8 @@ public:
     virtual bool isTextNode() const { return true; }
     virtual Id id() const;
     virtual void attach();
+    virtual bool rendererIsNeeded(khtml::RenderStyle *);
+    virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void recalcStyle( StyleChange = NoChange );
     virtual bool childTypeAllowed( unsigned short type );
 

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list