WebCore:

2009-01-25  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        Bug 23522: use checked casts for render tree
        https://bugs.webkit.org/show_bug.cgi?id=23522

        Step one: RenderText.

        Also change set of RenderFlow* to be a ListHashSet as the comment in the
        header indicated.

        * dom/CharacterData.cpp:
        (WebCore::CharacterData::setData): Use toRenderText.
        (WebCore::CharacterData::appendData): Ditto.
        (WebCore::CharacterData::insertData): Ditto.
        (WebCore::CharacterData::deleteData): Ditto.
        (WebCore::CharacterData::replaceData): Ditto.
        * dom/ContainerNode.cpp:
        (WebCore::ContainerNode::getUpperLeftCorner): Ditto.
        (WebCore::ContainerNode::getLowerRightCorner): Ditto.
        * dom/Position.cpp:
        (WebCore::nextRenderedEditable): Ditto.
        (WebCore::previousRenderedEditable): Ditto.
        (WebCore::Position::renderedOffset): Ditto. Also use function members
        instead of data members of InlineTextBox.
        (WebCore::Position::upstream): Ditto.
        (WebCore::Position::downstream): Ditto.
        (WebCore::Position::hasRenderedNonAnonymousDescendantsWithHeight): Ditto.
        (WebCore::Position::inRenderedText): Ditto.
        (WebCore::Position::isRenderedCharacter): Ditto.
        (WebCore::searchAheadForBetterMatch): Ditto.
        (WebCore::Position::getInlineBoxAndOffset): Ditto.

        * dom/Range.cpp: Added include of VisiblePosition.h now that it's no longer
        included in RenderObject.h.

        * dom/Text.cpp:
        (WebCore::Text::splitText): Use toRenderText.
        (WebCore::Text::recalcStyle): Ditto.
        * editing/CompositeEditCommand.cpp:
        (WebCore::CompositeEditCommand::deleteInsignificantText): Ditto.
        * editing/SelectionController.cpp:
        (WebCore::SelectionController::debugRenderer): Ditto.
        * editing/TextIterator.cpp:
        (WebCore::TextIterator::handleTextNode): Ditto.
        (WebCore::TextIterator::handleTextBox): Ditto.
        (WebCore::TextIterator::emitText): Ditto.
        (WebCore::SimplifiedBackwardsTextIterator::handleTextNode): Ditto.

        * editing/VisiblePosition.cpp: Added include of FloatQuad.h now that it's
        no longer included in RenderObject.h.
        * inspector/InspectorController.cpp: Ditto.
        * page/Frame.cpp: Ditto.
        * rendering/RenderBox.cpp: Ditto.
        * rendering/RenderInline.cpp: Ditto.
        * rendering/RenderPath.cpp: Ditto.
        * rendering/RenderSVGContainer.cpp: Ditto.
        * rendering/RenderSVGImage.cpp: Ditto.
        * rendering/RenderSVGInlineText.cpp: Ditto.
        * rendering/RenderSVGTSpan.cpp: Ditto.
        * rendering/RenderSVGText.cpp: Ditto.
        * rendering/RenderSVGTextPath.cpp: Ditto.
        * rendering/RenderTableCell.cpp: Ditto.
        * rendering/RenderView.cpp: Ditto.

        * editing/visible_units.cpp:
        (WebCore::startPositionForLine): Use function members instead of data
        members of InlineTextBox.
        (WebCore::endPositionForLine): Ditto.
        (WebCore::startOfParagraph): Use toRenderText.
        (WebCore::endOfParagraph): Ditto.

        * page/AccessibilityRenderObject.cpp:
        (WebCore::AccessibilityRenderObject::accessibilityIsIgnored): Use toRenderText.
        * rendering/InlineFlowBox.cpp:
        (WebCore::InlineFlowBox::placeBoxesHorizontally): Ditto.
        * rendering/InlineTextBox.cpp:
        (WebCore::InlineTextBox::deleteLine): Ditto.
        (WebCore::InlineTextBox::extractLine): Ditto.
        (WebCore::InlineTextBox::attachLine): Ditto.
        (WebCore::InlineTextBox::placeEllipsisBox): Ditto.
        (WebCore::InlineTextBox::paintDecoration): Ditto.
        (WebCore::InlineTextBox::paintCompositionUnderline): Ditto.
        (WebCore::InlineTextBox::offsetForPosition): Ditto.
        (WebCore::InlineTextBox::positionForOffset): Ditto.

        * rendering/InlineTextBox.h: Made most members private. Use toRenderText.

        * rendering/RenderArena.cpp:
        (WebCore::RenderArena::allocate): Use static_cast instead of C-style cast.
        (WebCore::RenderArena::free): Ditto.

        * rendering/RenderBlock.cpp:
        (WebCore::RenderBlock::addContinuationWithOutline): Use ListHashSet<RenderFlow*>
        instead of RenderFlowSequencedSet.
        (WebCore::RenderBlock::paintContinuationOutlines): Ditto.
        (WebCore::stripTrailingSpace): Ditto.
        (WebCore::RenderBlock::calcInlinePrefWidths): Ditto.
        (WebCore::RenderBlock::updateFirstLetter): Ditto.

        * rendering/RenderContainer.cpp:
        (WebCore::RenderContainer::addChild): Use toRenderText.

        * rendering/RenderFlow.cpp:
        (WebCore::RenderFlow::dirtyLinesFromChangedChild): Use ListHashSet<RenderFlow*>
        instead of RenderFlowSequencedSet.
        (WebCore::RenderFlow::paintLines): Ditto.

        * rendering/RenderMenuList.cpp: Removed some unneeded includes.

        * rendering/RenderMenuList.h: Added now-needed forward declaration of RenderText.
        Made more members private.

        * rendering/RenderObject.cpp: Updated includes.
        (WebCore::RenderObject::isEditable): Use toRenderText.
        (WebCore::RenderObject::positionForPoint): Made non-inline so we wouldn't have to
        include VisiblePosition.h in the header just for this.

        * rendering/RenderObject.h: Removed unneeded includes and forward declarations.
        Changed special vertical position values to be constants rather than an enum.
        Eliminated RenderFlowSequencedSet, and changed clients to use ListHashSet<RenderFlow*>.

        * rendering/RenderText.cpp:
        (WebCore::RenderText::findNextInlineTextBox): Use function members instead of
        data members of InlineTextBox.
        (WebCore::RenderText::positionForCoordinates): Ditto.
        (WebCore::isInlineFlowOrEmptyText): Use toRenderText.
        (WebCore::RenderText::previousCharacter): Use function members instead of
        data members of InlineTextBox.
        (WebCore::RenderText::position): Ditto.
        (WebCore::RenderText::caretMinOffset): Ditto.
        (WebCore::RenderText::caretMaxOffset): Ditto.
        (WebCore::RenderText::caretMaxRenderedOffset): Ditto.

        * rendering/RenderText.h: Added definition of toRenderText.

        * rendering/RenderTextControl.cpp:
        (WebCore::RenderTextControl::textWithHardLineBreaks): Use toRenderText.
        * rendering/RenderTreeAsText.cpp:
        (WebCore::operator<<): Use toRenderText and toRenderBox.
        (WebCore::writeTextRun): Ditto.
        (WebCore::write): Ditto.

        * rendering/bidi.cpp:
        (WebCore::InlineIterator::increment): Use toRenderText.
        (WebCore::InlineIterator::current): Ditto.
        (WebCore::checkMidpoints): Ditto.
        (WebCore::RenderBlock::computeHorizontalPositionsForLine): Ditto.
        (WebCore::RenderBlock::layoutInlineChildren): Ditto.
        (WebCore::RenderBlock::determineStartPosition): Ditto.
        (WebCore::shouldSkipWhitespaceAfterStartObject): Ditto.
        (WebCore::RenderBlock::findNextLineBreak): Ditto.

WebKit/mac:

2009-01-25  Darin Adler  <darin@apple.com>

        Reviewed by Sam Weinig.

        Bug 23522: use checked casts for render tree
        https://bugs.webkit.org/show_bug.cgi?id=23522

        Step one: RenderText.

        * WebView/WebRenderNode.mm:
        (copyRenderNode): Use toRenderText.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@40229 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp
index 199396f..53fad27 100644
--- a/WebCore/rendering/bidi.cpp
+++ b/WebCore/rendering/bidi.cpp
@@ -278,7 +278,7 @@
         return;
     if (obj->isText()) {
         pos++;
-        if (pos >= static_cast<RenderText*>(obj)->textLength()) {
+        if (pos >= toRenderText(obj)->textLength()) {
             obj = bidiNext(block, obj, resolver);
             pos = 0;
             nextBreakablePosition = -1;
@@ -306,7 +306,7 @@
     if (!obj || !obj->isText())
         return 0;
 
-    RenderText* text = static_cast<RenderText*>(obj);
+    RenderText* text = toRenderText(obj);
     if (pos >= text->textLength())
         return 0;
 
@@ -358,12 +358,12 @@
             if (endpoint.obj->style()->collapseWhiteSpace()) {
                 if (endpoint.obj->isText()) {
                     // Don't shave a character off the endpoint if it was from a soft hyphen.
-                    RenderText* textObj = static_cast<RenderText*>(endpoint.obj);
+                    RenderText* textObj = toRenderText(endpoint.obj);
                     if (endpoint.pos + 1 < textObj->textLength()) {
                         if (textObj->characters()[endpoint.pos+1] == softHyphen)
                             return;
                     } else if (startpoint.obj->isText()) {
-                        RenderText *startText = static_cast<RenderText*>(startpoint.obj);
+                        RenderText *startText = toRenderText(startpoint.obj);
                         if (startText->textLength() && startText->characters()[0] == softHyphen)
                             return;
                     }
@@ -578,7 +578,7 @@
                       // correct static x position.  They have no effect on the width.
                       // Similarly, line break boxes have no effect on the width.
         if (r->m_object->isText()) {
-            RenderText* rt = static_cast<RenderText*>(r->m_object);
+            RenderText* rt = toRenderText(r->m_object);
 
             if (textAlign == JUSTIFY && r != trailingSpaceRun) {
                 const UChar* characters = rt->characters();
@@ -688,7 +688,7 @@
             int spaceAdd = 0;
             if (r->m_object->isText() && !r->m_compact) {
                 unsigned spaces = 0;
-                const UChar* characters = static_cast<RenderText*>(r->m_object)->characters();
+                const UChar* characters = toRenderText(r->m_object)->characters();
                 for (int i = r->m_start; i < r->m_stop; i++) {
                     UChar c = characters[i];
                     if (c == ' ' || c == '\n' || c == '\t')
@@ -963,7 +963,7 @@
                     trailingSpaceRun = resolver.logicallyLastRun();
                     RenderObject* lastObject = trailingSpaceRun->m_object;
                     if (lastObject->isText()) {
-                        RenderText* lastText = static_cast<RenderText*>(lastObject);
+                        RenderText* lastText = toRenderText(lastObject);
                         const UChar* characters = lastText->characters();
                         int firstSpace = trailingSpaceRun->stop();
                         while (firstSpace > trailingSpaceRun->start()) {
@@ -1211,7 +1211,7 @@
             // We have a dirty line.
             if (RootInlineBox* prevRootBox = curr->prevRootBox()) {
                 // We have a previous line.
-                if (!dirtiedByFloat && (!prevRootBox->endsWithBreak() || prevRootBox->lineBreakObj()->isText() && prevRootBox->lineBreakPos() >= static_cast<RenderText*>(prevRootBox->lineBreakObj())->textLength()))
+                if (!dirtiedByFloat && (!prevRootBox->endsWithBreak() || prevRootBox->lineBreakObj()->isText() && prevRootBox->lineBreakPos() >= toRenderText(prevRootBox->lineBreakObj())->textLength()))
                     // The previous line didn't break cleanly or broke at a newline
                     // that has been deleted, so treat it as dirty too.
                     curr = prevRootBox;
@@ -1531,8 +1531,8 @@
 static bool shouldSkipWhitespaceAfterStartObject(RenderBlock* block, RenderObject* o)
 {
     RenderObject* next = bidiNext(block, o);
-    if (next && !next->isBR() && next->isText() && static_cast<RenderText*>(next)->textLength() > 0) {
-        RenderText* nextText = static_cast<RenderText*>(next);
+    if (next && !next->isBR() && next->isText() && toRenderText(next)->textLength() > 0) {
+        RenderText* nextText = toRenderText(next);
         UChar nextChar = nextText->characters()[0];
         if (nextText->style()->isCollapsibleWhiteSpace(nextChar)) {
             addMidpoint(InlineIterator(0, o, 0));
@@ -1768,7 +1768,7 @@
             if (!pos)
                 appliedStartWidth = false;
 
-            RenderText* t = static_cast<RenderText*>(o);
+            RenderText* t = toRenderText(o);
 
             int strlen = t->textLength();
             int len = strlen - pos;
@@ -1815,7 +1815,7 @@
                         if (pos)
                             beforeSoftHyphen = InlineIterator(0, o, pos - 1);
                         else
-                            beforeSoftHyphen = InlineIterator(0, last, last->isText() ? static_cast<RenderText*>(last)->textLength() - 1 : 0);
+                            beforeSoftHyphen = InlineIterator(0, last, last->isText() ? toRenderText(last)->textLength() - 1 : 0);
                         // Two consecutive soft hyphens. Avoid overlapping midpoints.
                         if (sNumMidpoints && smidpoints->at(sNumMidpoints - 1).obj == o && smidpoints->at(sNumMidpoints - 1).pos == pos)
                             sNumMidpoints--;
@@ -1905,7 +1905,7 @@
                             }
                         }
                         if (lineWasTooWide || w + tmpW > width) {
-                            if (lBreak.obj && shouldPreserveNewline(lBreak.obj) && lBreak.obj->isText() && !static_cast<RenderText*>(lBreak.obj)->isWordBreak() && static_cast<RenderText*>(lBreak.obj)->characters()[lBreak.pos] == '\n') {
+                            if (lBreak.obj && shouldPreserveNewline(lBreak.obj) && lBreak.obj->isText() && !toRenderText(lBreak.obj)->isWordBreak() && toRenderText(lBreak.obj)->characters()[lBreak.pos] == '\n') {
                                 if (!stoppedIgnoringSpaces && pos > 0) {
                                     // We need to stop right before the newline and then start up again.
                                     addMidpoint(InlineIterator(0, o, pos - 1)); // Stop
@@ -2026,7 +2026,7 @@
                     checkForBreak = true;
                 else {
                     checkForBreak = false;
-                    RenderText* nextText = static_cast<RenderText*>(next);
+                    RenderText* nextText = toRenderText(next);
                     if (nextText->textLength()) {
                         UChar c = nextText->characters()[0];
                         if (c == ' ' || c == '\t' || (c == '\n' && !shouldPreserveNewline(next)))
@@ -2150,7 +2150,7 @@
         //    lBreak.pos--;
         else if (lBreak.obj == 0 && trailingSpaceObject->isText()) {
             // Add a new end midpoint that stops right at the very end.
-            RenderText* text = static_cast<RenderText *>(trailingSpaceObject);
+            RenderText* text = toRenderText(trailingSpaceObject);
             unsigned length = text->textLength();
             unsigned pos = length >= 2 ? length - 2 : UINT_MAX;
             InlineIterator endMid(0, trailingSpaceObject, pos);
@@ -2170,7 +2170,7 @@
     if (lBreak.obj && lBreak.pos >= 2 && lBreak.obj->isText()) {
         // For soft hyphens on line breaks, we have to chop out the midpoints that made us
         // ignore the hyphen so that it will render at the end of the line.
-        UChar c = static_cast<RenderText*>(lBreak.obj)->characters()[lBreak.pos-1];
+        UChar c = toRenderText(lBreak.obj)->characters()[lBreak.pos-1];
         if (c == softHyphen)
             chopMidpointsAt(lBreak.obj, lBreak.pos-2);
     }