LayoutTests:
Reviewed by Dave Hyatt.
- test for http://bugzilla.opendarwin.org/show_bug.cgi?id=7216
white-space: pre-wrap collapses leading whitespace following a newline
* fast/text/whitespace/pre-wrap-spaces-after-newline-expected.checksum: Added.
* fast/text/whitespace/pre-wrap-spaces-after-newline-expected.png: Added.
* fast/text/whitespace/pre-wrap-spaces-after-newline-expected.txt: Added.
* fast/text/whitespace/pre-wrap-spaces-after-newline.html: Added.
WebCore:
Test: fast/text/whitespace/pre-wrap-spaces-after-newline.html
Reviewed by Dave Hyatt.
- fix http://bugzilla.opendarwin.org/show_bug.cgi?id=7216
white-space: pre-wrap collapses leading whitespace following a newline
* rendering/bidi.cpp:
(khtml::RenderBlock::bidiReorderLine): Use previousLineBrokeCleanly instead of
resetBidiAtEnd now that the former is always correct.
(khtml::RenderBlock::layoutInlineChildren): Use new skipTrailingNewline flag.
(khtml::RenderBlock::findNextLineBreak): Set previousLineBrokeCleanly for line breaks
caused by newlines as well. Added skipTrailingNewline flag.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@12868 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/rendering/bidi.cpp b/WebCore/rendering/bidi.cpp
index 0265ff6..b5179c5 100644
--- a/WebCore/rendering/bidi.cpp
+++ b/WebCore/rendering/bidi.cpp
@@ -100,6 +100,7 @@
static bool isLineEmpty = true;
static bool previousLineBrokeCleanly = true;
+static bool skipTrailingNewline = false;
static bool emptyRun = true;
static int numSpaces;
@@ -1008,18 +1009,17 @@
bidi.current = start;
bidi.last = bidi.current;
bool pastEnd = false;
- bool resetBidiAtEnd = false;
BidiState stateAtEnd;
while (true) {
QChar::Direction dirCurrent;
- if (pastEnd && (resetBidiAtEnd || bidi.current.atEnd())) {
+ if (pastEnd && (previousLineBrokeCleanly || bidi.current.atEnd())) {
//kdDebug(6041) << "atEnd" << endl;
BidiContext *c = bidi.context.get();
while (c->parent)
c = c->parent;
dirCurrent = c->dir;
- if (resetBidiAtEnd) {
+ if (previousLineBrokeCleanly) {
// A deviation from the Unicode Bidi Algorithm in order to match
// Mac OS X text and WinIE: a hard line break resets bidi state.
stateAtEnd.context = c;
@@ -1360,7 +1360,6 @@
stateAtEnd = bidi;
bidi.endOfLine = bidi.last;
pastEnd = true;
- resetBidiAtEnd = previousLineBrokeCleanly || (end.obj && end.obj->style()->preserveNewline() && end.current() == '\n');
}
}
@@ -1628,7 +1627,7 @@
}
}
- if (end == start || (!previousLineBrokeCleanly && end.obj && end.obj->style()->preserveNewline() && end.current() == '\n')) {
+ if (end == start || skipTrailingNewline) {
bidi.adjustEmbedding = true;
end.increment(bidi);
bidi.adjustEmbedding = false;
@@ -1973,6 +1972,7 @@
bool prevLineBrokeCleanly = previousLineBrokeCleanly;
previousLineBrokeCleanly = false;
+ skipTrailingNewline = false;
while (o) {
if (o->isBR()) {
@@ -2246,6 +2246,10 @@
skipWhitespace(lBreak, bidi);
}
}
+ if (lBreak.obj && lBreak.obj->style()->preserveNewline() && lBreak.obj->isText() && static_cast<RenderText*>(lBreak.obj)->text()[lBreak.pos] == '\n') {
+ previousLineBrokeCleanly = true;
+ skipTrailingNewline = true;
+ }
goto end; // Didn't fit. Jump to the end.
} else {
if (midWordBreak)
@@ -2256,9 +2260,11 @@
}
}
- if (*(str+pos) == '\n' && o->style()->preserveNewline()) {
+ if (c == '\n' && o->style()->preserveNewline()) {
lBreak.obj = o;
lBreak.pos = pos;
+ previousLineBrokeCleanly = true;
+ skipTrailingNewline = true;
return lBreak;
}