WebCore:
Reviewed by Darin Adler.
- fix <rdar://problem/5637569> CrashTracer: [REGRESSION] 620 crashes in Safari at com.apple.WebCore: WebCore::RenderBox::setStaticY + 15
Test: fast/text/wbr-styled.html
Changed RenderWordBreak to inherit from RenderText instead of
RenderInline.
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::calcInlinePrefWidths):
* rendering/RenderFlow.h:
* rendering/RenderText.cpp:
(WebCore::RenderText::renderName):
(WebCore::RenderText::isTextFragment):
(WebCore::RenderText::isWordBreak):
* rendering/RenderText.h:
* rendering/RenderWordBreak.cpp:
(WebCore::RenderWordBreak::RenderWordBreak):
* rendering/RenderWordBreak.h:
* rendering/bidi.cpp:
(WebCore::RenderBlock::findNextLineBreak):
LayoutTests:
Reviewed by Darin Adler.
- test for <rdar://problem/5637569> CrashTracer: [REGRESSION] 620 crashes in Safari at com.apple.WebCore: WebCore::RenderBox::setStaticY + 15
* fast/text/wbr-styled.html: Added.
* platform/mac-leopard/fast/text/wbr-styled-expected.checksum: Added.
* platform/mac-leopard/fast/text/wbr-styled-expected.png: Added.
* platform/mac/fast/css-generated-content/wbr-with-before-content-expected.txt:
* platform/mac/fast/text/wbr-pre-expected.txt:
* platform/mac/fast/text/wbr-styled-expected.txt: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@30412 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp
index 5e63c0b..77b37a9 100644
--- a/WebCore/rendering/bidi.cpp
+++ b/WebCore/rendering/bidi.cpp
@@ -1506,12 +1506,6 @@
}
}
- if (static_cast<RenderFlow*>(o)->isWordBreak()) {
- w += tmpW;
- tmpW = 0;
- lBreak.obj = o;
- lBreak.pos = 0;
- }
tmpW += o->marginLeft() + o->borderLeft() + o->paddingLeft() +
o->marginRight() + o->borderRight() + o->paddingRight();
} else if (o->isReplaced()) {
@@ -1547,6 +1541,7 @@
tmpW += o->width() + o->marginLeft() + o->marginRight() + inlineWidth(o);
} else if (o->isText()) {
RenderText* t = static_cast<RenderText*>(o);
+
int strlen = t->textLength();
int len = strlen - pos;
const UChar* str = t->characters();
@@ -1569,6 +1564,14 @@
bool midWordBreak = false;
bool breakAll = o->style()->wordBreak() == BreakAllWordBreak && autoWrap;
+ if (t->isWordBreak()) {
+ w += tmpW;
+ tmpW = 0;
+ lBreak.obj = o;
+ lBreak.pos = 0;
+ ASSERT(!len);
+ }
+
while (len) {
bool previousCharacterIsSpace = currentCharacterIsSpace;
bool previousCharacterIsWS = currentCharacterIsWS;
@@ -1799,7 +1802,7 @@
len--;
atStart = false;
}
-
+
// IMPORTANT: pos is > length here!
if (!ignoringSpaces)
tmpW += t->width(lastSpace, pos - lastSpace, f, w+tmpW) + lastSpaceWordSpacing;
@@ -1818,14 +1821,15 @@
else {
checkForBreak = false;
RenderText* nextText = static_cast<RenderText*>(next);
- if (nextText->textLength() != 0) {
+ if (nextText->textLength()) {
UChar c = nextText->characters()[0];
if (c == ' ' || c == '\t' || (c == '\n' && !shouldPreserveNewline(next)))
// If the next item on the line is text, and if we did not end with
// a space, then the next text run continues our word (and so it needs to
// keep adding to |tmpW|. Just update and continue.
checkForBreak = true;
- }
+ } else if (nextText->isWordBreak())
+ checkForBreak = true;
bool willFitOnLine = (w + tmpW <= width);
bool canPlaceOnLine = willFitOnLine || !autoWrapWasEverTrueOnLine;
if (canPlaceOnLine && checkForBreak) {