bug 564737 - plaintext serializer shouldn't take care of leading spaces in a block. tests by David :Bienvenu. r=laurentj sr+a=jst

This commit is contained in:
Jonathan Kamens 2010-09-21 15:02:55 +02:00
Родитель db0f8312e1
Коммит 9730e0d359
3 изменённых файлов: 58 добавлений и 34 удалений

Просмотреть файл

@ -119,7 +119,7 @@ nsPlainTextSerializer::nsPlainTextSerializer()
// Flow
mEmptyLines = 1; // The start of the document is an "empty line" in itself,
mInWhitespace = PR_TRUE;
mInWhitespace = PR_FALSE;
mPreFormatted = PR_FALSE;
mStartedOutput = PR_FALSE;
@ -638,6 +638,8 @@ nsPlainTextSerializer::DoOpenContainer(const nsIParserNode* aNode, PRInt32 aTag)
}
}
else {
/* See comment at end of function. */
mInWhitespace = PR_TRUE;
mPreFormatted = PR_FALSE;
}
@ -807,6 +809,13 @@ nsPlainTextSerializer::DoOpenContainer(const nsIParserNode* aNode, PRInt32 aTag)
Write(NS_LITERAL_STRING("_"));
}
/* Container elements are always block elements, so we shouldn't
output any whitespace immediately after the container tag even if
there's extra whitespace there because the HTML is pretty-printed
or something. To ensure that happens, tell the serializer we're
already in whitespace so it won't output more. */
mInWhitespace = PR_TRUE;
return NS_OK;
}
@ -1073,38 +1082,26 @@ nsPlainTextSerializer::DoAddLeaf(const nsIParserNode *aNode, PRInt32 aTag,
EnsureVerticalSpace(mEmptyLines+1);
}
}
else if (type == eHTMLTag_whitespace) {
else if (type == eHTMLTag_whitespace || type == eHTMLTag_newline) {
// The only times we want to pass along whitespace from the original
// html source are if we're forced into preformatted mode via flags,
// or if we're prettyprinting and we're inside a <pre>.
// Otherwise, either we're collapsing to minimal text, or we're
// prettyprinting to mimic the html format, and in neither case
// does the formatting of the html source help us.
// One exception: at the very beginning of a selection,
// we want to preserve whitespace.
if (mFlags & nsIDocumentEncoder::OutputPreformatted ||
(mPreFormatted && !mWrapColumn) ||
IsInPre()) {
Write(aText);
if (type == eHTMLTag_newline)
EnsureVerticalSpace(mEmptyLines+1);
else
Write(aText);
}
else if(!mInWhitespace ||
(!mStartedOutput
&& mFlags | nsIDocumentEncoder::OutputSelectionOnly)) {
mInWhitespace = PR_FALSE;
else if(!mInWhitespace) {
Write(kSpace);
mInWhitespace = PR_TRUE;
}
}
else if (type == eHTMLTag_newline) {
if (mFlags & nsIDocumentEncoder::OutputPreformatted ||
(mPreFormatted && !mWrapColumn) ||
IsInPre()) {
EnsureVerticalSpace(mEmptyLines+1);
}
else {
Write(kSpace);
}
}
else if (type == eHTMLTag_hr &&
(mFlags & nsIDocumentEncoder::OutputFormatted)) {
EnsureVerticalSpace(0);
@ -1161,10 +1158,12 @@ nsPlainTextSerializer::EnsureVerticalSpace(PRInt32 noOfRows)
// realize that we should start a new line.
if(noOfRows >= 0 && !mInIndentString.IsEmpty()) {
EndLine(PR_FALSE);
mInWhitespace = PR_TRUE;
}
while(mEmptyLines < noOfRows) {
EndLine(PR_FALSE);
mInWhitespace = PR_TRUE;
}
mLineBreakDue = PR_FALSE;
mFloatingLines = -1;

Просмотреть файл

@ -46,6 +46,7 @@
#include "nsStringGlue.h"
#include "nsParserCIID.h"
#include "nsIDocumentEncoder.h"
#include "nsCRT.h"
static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
@ -143,6 +144,27 @@ TestCJKWithFlowedDelSp()
return NS_OK;
}
nsresult
TestPrettyPrintedHtml()
{
nsString test;
test.AppendLiteral(
"<html>" NS_LINEBREAK
"<body>" NS_LINEBREAK
" first<br>" NS_LINEBREAK
" second<br>" NS_LINEBREAK
"</body>" NS_LINEBREAK "</html>");
ConvertBufToPlainText(test, 0);
if (!test.EqualsLiteral("first" NS_LINEBREAK "second" NS_LINEBREAK)) {
fail("Wrong prettyprinted html to text serialization");
return NS_ERROR_FAILURE;
}
passed("prettyprinted HTML to text serialization test");
return NS_OK;
}
nsresult
TestPlainTextSerializer()
{
@ -163,6 +185,9 @@ TestPlainTextSerializer()
rv = TestCJKWithFlowedDelSp();
NS_ENSURE_SUCCESS(rv, rv);
rv = TestPrettyPrintedHtml();
NS_ENSURE_SUCCESS(rv, rv);
// Add new tests here...
return NS_OK;
}

Просмотреть файл

@ -112,36 +112,36 @@ function testCopyPaste () {
testPasteText("This is a draggable bit of text.");
copyChildrenToClipboard("alist");
testSelectionToString("bla\n\n foo\n bar\n\n");
testClipboardValue("text/unicode", " bla\n\n foo\n bar\n\n");
testSelectionToString(" bla\n\n foo\n bar\n\n");
testClipboardValue("text/unicode", "bla\n\n foo\n bar\n\n");
testClipboardValue("text/html", "<div id=\"alist\">\n bla\n <ul>\n <li>foo</li>\n \n <li>bar</li>\n </ul>\n </div>");
testPasteText(" bla\n\n foo\n bar\n\n");
testPasteText("bla\n\n foo\n bar\n\n");
copyChildrenToClipboard("blist");
testSelectionToString("mozilla\n\n foo\n bar\n\n");
testClipboardValue("text/unicode", " mozilla\n\n foo\n bar\n\n");
testSelectionToString(" mozilla\n\n foo\n bar\n\n");
testClipboardValue("text/unicode", "mozilla\n\n foo\n bar\n\n");
testClipboardValue("text/html", "<div id=\"blist\">\n mozilla\n <ol>\n <li>foo</li>\n \n <li>bar</li>\n </ol>\n </div>");
testPasteText(" mozilla\n\n foo\n bar\n\n");
testPasteText("mozilla\n\n foo\n bar\n\n");
copyChildrenToClipboard("clist");
testSelectionToString("mzla\n\n foo\n bazzinga!\n bar\n\n");
testClipboardValue("text/unicode", " mzla\n\n foo\n bazzinga!\n bar\n\n");
testSelectionToString(" mzla\n\n foo\n bazzinga!\n bar\n\n");
testClipboardValue("text/unicode", "mzla\n\n foo\n bazzinga!\n bar\n\n");
testClipboardValue("text/html", "<div id=\"clist\">\n mzla\n <ul>\n <li>foo<ul>\n <li>bazzinga!</li>\n </ul></li>\n \n <li>bar</li>\n </ul>\n </div>");
testPasteText(" mzla\n\n foo\n bazzinga!\n bar\n\n");
testPasteText("mzla\n\n foo\n bazzinga!\n bar\n\n");
copyChildrenToClipboard("div4");
testSelectionToString("Tt t t ");
testClipboardValue("text/unicode", " Tt t t ");
testSelectionToString(" Tt t t ");
testClipboardValue("text/unicode", "Tt t t ");
testClipboardValue("text/html", "<div id=\"div4\">\n T<textarea>t t t</textarea>\n</div>");
testInnerHTML("div4", "\n T<textarea>t t t</textarea>\n");
testPasteText(" Tt t t ");
testPasteText("Tt t t ");
copyChildrenToClipboard("div5");
testSelectionToString("T ");
testClipboardValue("text/unicode", " T ");
testSelectionToString(" T ");
testClipboardValue("text/unicode", "T ");
testClipboardValue("text/html", "<div id=\"div5\">\n T<textarea> </textarea>\n</div>");
testInnerHTML("div5", "\n T<textarea> </textarea>\n");
testPasteText(" T ");
testPasteText("T ");
copyRangeToClipboard($("div6").childNodes[0],0, $("div6").childNodes[1],1);
testSelectionToString("");