Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(543)

Side by Side Diff: Source/WebCore/rendering/RenderBlock.cpp

Issue 9252031: Merge 104123 - Crash due to first-letter block processing (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/963/
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 5726 matching lines...) Expand 10 before | Expand all | Expand 10 after
5737 LayoutStateDisabler layoutStateDisabler(view()); 5737 LayoutStateDisabler layoutStateDisabler(view());
5738 while (RenderObject* child = firstLetter->firstChild()) { 5738 while (RenderObject* child = firstLetter->firstChild()) {
5739 if (child->isText()) 5739 if (child->isText())
5740 toRenderText(child)->removeAndDestroyTextBoxes(); 5740 toRenderText(child)->removeAndDestroyTextBoxes();
5741 firstLetter->removeChild(child); 5741 firstLetter->removeChild(child);
5742 newFirstLetter->addChild(child, 0); 5742 newFirstLetter->addChild(child, 0);
5743 } 5743 }
5744 5744
5745 RenderTextFragment* remainingText = 0; 5745 RenderTextFragment* remainingText = 0;
5746 RenderObject* nextSibling = firstLetter->nextSibling(); 5746 RenderObject* nextSibling = firstLetter->nextSibling();
5747 RenderObject* next = nextSibling; 5747 RenderObject* remainingTextObject = toRenderBoxModelObject(firstLett er)->firstLetterRemainingText();
5748 while (next) { 5748 if (remainingTextObject && remainingTextObject->isText() && toRender Text(remainingTextObject)->isTextFragment())
5749 if (next->isText() && toRenderText(next)->isTextFragment()) { 5749 remainingText = toRenderTextFragment(remainingTextObject);
5750 remainingText = toRenderTextFragment(next);
5751 break;
5752 }
5753 next = next->nextSibling();
5754 }
5755 if (!remainingText && firstLetterContainer->isAnonymousBlock()) {
5756 // The remaining text fragment could have been wrapped in a diff erent anonymous block since creation
5757 RenderObject* nextChild;
5758 next = firstLetterContainer->nextSibling();
5759 while (next && !remainingText) {
5760 if (next->isAnonymousBlock()) {
5761 nextChild = next->firstChild();
5762 while (nextChild) {
5763 if (nextChild->isText() && toRenderText(nextChild)-> isTextFragment()
5764 && (toRenderTextFragment(nextChild)->firstLetter () == firstLetter)) {
5765 remainingText = toRenderTextFragment(nextChild);
5766 break;
5767 }
5768 nextChild = nextChild->nextSibling();
5769 }
5770 } else
5771 break;
5772 next = next->nextSibling();
5773 }
5774 }
5775 if (remainingText) { 5750 if (remainingText) {
5776 ASSERT(remainingText->isAnonymous() || remainingText->node()->re nderer() == remainingText); 5751 ASSERT(remainingText->isAnonymous() || remainingText->node()->re nderer() == remainingText);
5777 // Replace the old renderer with the new one. 5752 // Replace the old renderer with the new one.
5778 remainingText->setFirstLetter(newFirstLetter); 5753 remainingText->setFirstLetter(newFirstLetter);
5754 toRenderBoxModelObject(newFirstLetter)->setFirstLetterRemainingT ext(remainingText);
5779 } 5755 }
5780 firstLetter->destroy(); 5756 firstLetter->destroy();
5781 firstLetter = newFirstLetter; 5757 firstLetter = newFirstLetter;
5782 firstLetterContainer->addChild(firstLetter, nextSibling); 5758 firstLetterContainer->addChild(firstLetter, nextSibling);
5783 } else 5759 } else
5784 firstLetter->setStyle(pseudoStyle); 5760 firstLetter->setStyle(pseudoStyle);
5785 5761
5786 for (RenderObject* genChild = firstLetter->firstChild(); genChild; genCh ild = genChild->nextSibling()) { 5762 for (RenderObject* genChild = firstLetter->firstChild(); genChild; genCh ild = genChild->nextSibling()) {
5787 if (genChild->isText()) 5763 if (genChild->isText())
5788 genChild->setStyle(pseudoStyle); 5764 genChild->setStyle(pseudoStyle);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
5846 // This text fragment might be empty. 5822 // This text fragment might be empty.
5847 RenderTextFragment* remainingText = 5823 RenderTextFragment* remainingText =
5848 new (renderArena()) RenderTextFragment(textObj->node() ? textObj->no de() : textObj->document(), oldText.get(), length, oldText->length() - length); 5824 new (renderArena()) RenderTextFragment(textObj->node() ? textObj->no de() : textObj->document(), oldText.get(), length, oldText->length() - length);
5849 remainingText->setStyle(textObj->style()); 5825 remainingText->setStyle(textObj->style());
5850 if (remainingText->node()) 5826 if (remainingText->node())
5851 remainingText->node()->setRenderer(remainingText); 5827 remainingText->node()->setRenderer(remainingText);
5852 5828
5853 firstLetterContainer->addChild(remainingText, textObj); 5829 firstLetterContainer->addChild(remainingText, textObj);
5854 firstLetterContainer->removeChild(textObj); 5830 firstLetterContainer->removeChild(textObj);
5855 remainingText->setFirstLetter(firstLetter); 5831 remainingText->setFirstLetter(firstLetter);
5832 toRenderBoxModelObject(firstLetter)->setFirstLetterRemainingText(remaini ngText);
5856 5833
5857 // construct text fragment for the first letter 5834 // construct text fragment for the first letter
5858 RenderTextFragment* letter = 5835 RenderTextFragment* letter =
5859 new (renderArena()) RenderTextFragment(remainingText->node() ? remai ningText->node() : remainingText->document(), oldText.get(), 0, length); 5836 new (renderArena()) RenderTextFragment(remainingText->node() ? remai ningText->node() : remainingText->document(), oldText.get(), 0, length);
5860 letter->setStyle(pseudoStyle); 5837 letter->setStyle(pseudoStyle);
5861 firstLetter->addChild(letter); 5838 firstLetter->addChild(letter);
5862 5839
5863 textObj->destroy(); 5840 textObj->destroy();
5864 } 5841 }
5865 } 5842 }
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after
7067 } 7044 }
7068 7045
7069 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 7046 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
7070 { 7047 {
7071 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY()); 7048 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY());
7072 } 7049 }
7073 7050
7074 #endif 7051 #endif
7075 7052
7076 } // namespace WebCore 7053 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698