diff --git a/mozilla/htmlparser/src/nsLoggingSink.cpp b/mozilla/htmlparser/src/nsLoggingSink.cpp
index e5b33efc5da..7c0287bcb52 100644
--- a/mozilla/htmlparser/src/nsLoggingSink.cpp
+++ b/mozilla/htmlparser/src/nsLoggingSink.cpp
@@ -24,6 +24,16 @@ static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
static NS_DEFINE_IID(kILoggingSinkIID, NS_ILOGGING_SINK_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+// list of tags that have skipped content
+static char gSkippedContentTags[] = {
+ eHTMLTag_style,
+ eHTMLTag_script,
+ eHTMLTag_server,
+ eHTMLTag_textarea,
+ eHTMLTag_title,
+ 0
+};
+
class nsLoggingSink : public nsILoggingSink {
public:
nsLoggingSink();
@@ -65,6 +75,7 @@ public:
nsresult LeafNode(const nsIParserNode& aNode);
nsresult WriteAttributes(const nsIParserNode& aNode);
nsresult QuoteText(const nsString& aValue, nsString& aResult);
+ PRBool WillWriteAttributes(const nsIParserNode& aNode);
protected:
FILE* mFile;
@@ -278,24 +289,30 @@ nsLoggingSink::CloseFrameset(const nsIParserNode& aNode)
nsresult
nsLoggingSink::OpenNode(const char* aKind, const nsIParserNode& aNode)
{
- fprintf(mFile, "\n", aKind);
+ fprintf(mFile, "= eHTMLTag_unknown) &&
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
const char* tag = NS_EnumToTag(nodeType);
- fprintf(mFile, " \n", tag);
+ fprintf(mFile, "tag=\"%s\"", tag);
}
else {
const nsString& text = aNode.GetText();
- fputs(" ", mFile);
+ fputs(" \"", mFile);
}
- WriteAttributes(aNode);
+ if (WillWriteAttributes(aNode)) {
+ fputs(">\n", mFile);
+ WriteAttributes(aNode);
+ fputs("\n", mFile);
+ }
+ else {
+ fputs("/>\n", mFile);
+ }
- fputs("\n", mFile);
return NS_OK;
}
@@ -306,22 +323,68 @@ nsLoggingSink::CloseNode(const char* aKind)
return NS_OK;
}
+
nsresult
nsLoggingSink::WriteAttributes(const nsIParserNode& aNode)
{
+ nsAutoString tmp, tmp2;
PRInt32 ac = aNode.GetAttributeCount();
for (PRInt32 i = 0; i < ac; i++) {
const nsString& k = aNode.GetKeyAt(i);
const nsString& v = aNode.GetValueAt(i);
fputs(" \n", mFile);
+ fputs("\" value=\"", mFile);
+
+ tmp.Truncate();
+ tmp.Append(v);
+ PRUnichar first = tmp.First();
+ if ((first == '"') || (first == '\'')) {
+ if (tmp.Last() == first) {
+ tmp.Cut(0, 1);
+ PRInt32 pos = tmp.Length() - 1;
+ if (pos >= 0) {
+ tmp.Cut(pos, 1);
+ }
+ } else {
+ // Mismatched quotes - leave them in
+ }
+ }
+ QuoteText(tmp, tmp2);
+ fputs(tmp2, mFile);
+ fputs("\"/>\n", mFile);
}
+
+ if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
+ const nsString& content = aNode.GetSkippedContent();
+ if (content.Length() > 0) {
+ nsAutoString tmp;
+ fputs(" \n", mFile);
+ }
+ }
+
return NS_OK;
}
+PRBool
+nsLoggingSink::WillWriteAttributes(const nsIParserNode& aNode)
+{
+ PRInt32 ac = aNode.GetAttributeCount();
+ if (0 != ac) {
+ return PR_TRUE;
+ }
+ if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
+ const nsString& content = aNode.GetSkippedContent();
+ if (content.Length() > 0) {
+ return PR_TRUE;
+ }
+ }
+ return PR_FALSE;
+}
+
nsresult
nsLoggingSink::LeafNode(const nsIParserNode& aNode)
{
@@ -329,16 +392,21 @@ nsLoggingSink::LeafNode(const nsIParserNode& aNode)
if ((nodeType >= eHTMLTag_unknown) &&
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
const char* tag = NS_EnumToTag(nodeType);
- fprintf(mFile, "\n", tag);
- WriteAttributes(aNode);
- fputs("\n", mFile);
+ fprintf(mFile, "\n", mFile);
+ WriteAttributes(aNode);
+ fputs("\n", mFile);
+ }
+ else {
+ fputs("/>\n", mFile);
+ }
}
else {
PRInt32 pos;
nsAutoString tmp;
switch (nodeType) {
case eHTMLTag_whitespace:
- case eHTMLTag_newline:
case eHTMLTag_text:
QuoteText(aNode.GetText(), tmp);
fputs("\n", mFile);
break;
+ case eHTMLTag_newline:
+ fputs("\n", mFile);
+ break;
+
case eHTMLTag_entity:
tmp.Append(aNode.GetText());
tmp.Cut(0, 1);
@@ -368,6 +440,7 @@ nsLoggingSink::LeafNode(const nsIParserNode& aNode)
nsresult
nsLoggingSink::QuoteText(const nsString& aValue, nsString& aResult)
{
+ aResult.Truncate();
const PRUnichar* cp = aValue.GetUnicode();
const PRUnichar* end = cp + aValue.Length();
while (cp < end) {
diff --git a/mozilla/parser/htmlparser/src/nsLoggingSink.cpp b/mozilla/parser/htmlparser/src/nsLoggingSink.cpp
index e5b33efc5da..7c0287bcb52 100644
--- a/mozilla/parser/htmlparser/src/nsLoggingSink.cpp
+++ b/mozilla/parser/htmlparser/src/nsLoggingSink.cpp
@@ -24,6 +24,16 @@ static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
static NS_DEFINE_IID(kILoggingSinkIID, NS_ILOGGING_SINK_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
+// list of tags that have skipped content
+static char gSkippedContentTags[] = {
+ eHTMLTag_style,
+ eHTMLTag_script,
+ eHTMLTag_server,
+ eHTMLTag_textarea,
+ eHTMLTag_title,
+ 0
+};
+
class nsLoggingSink : public nsILoggingSink {
public:
nsLoggingSink();
@@ -65,6 +75,7 @@ public:
nsresult LeafNode(const nsIParserNode& aNode);
nsresult WriteAttributes(const nsIParserNode& aNode);
nsresult QuoteText(const nsString& aValue, nsString& aResult);
+ PRBool WillWriteAttributes(const nsIParserNode& aNode);
protected:
FILE* mFile;
@@ -278,24 +289,30 @@ nsLoggingSink::CloseFrameset(const nsIParserNode& aNode)
nsresult
nsLoggingSink::OpenNode(const char* aKind, const nsIParserNode& aNode)
{
- fprintf(mFile, "\n", aKind);
+ fprintf(mFile, "= eHTMLTag_unknown) &&
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
const char* tag = NS_EnumToTag(nodeType);
- fprintf(mFile, " \n", tag);
+ fprintf(mFile, "tag=\"%s\"", tag);
}
else {
const nsString& text = aNode.GetText();
- fputs(" ", mFile);
+ fputs(" \"", mFile);
}
- WriteAttributes(aNode);
+ if (WillWriteAttributes(aNode)) {
+ fputs(">\n", mFile);
+ WriteAttributes(aNode);
+ fputs("\n", mFile);
+ }
+ else {
+ fputs("/>\n", mFile);
+ }
- fputs("\n", mFile);
return NS_OK;
}
@@ -306,22 +323,68 @@ nsLoggingSink::CloseNode(const char* aKind)
return NS_OK;
}
+
nsresult
nsLoggingSink::WriteAttributes(const nsIParserNode& aNode)
{
+ nsAutoString tmp, tmp2;
PRInt32 ac = aNode.GetAttributeCount();
for (PRInt32 i = 0; i < ac; i++) {
const nsString& k = aNode.GetKeyAt(i);
const nsString& v = aNode.GetValueAt(i);
fputs(" \n", mFile);
+ fputs("\" value=\"", mFile);
+
+ tmp.Truncate();
+ tmp.Append(v);
+ PRUnichar first = tmp.First();
+ if ((first == '"') || (first == '\'')) {
+ if (tmp.Last() == first) {
+ tmp.Cut(0, 1);
+ PRInt32 pos = tmp.Length() - 1;
+ if (pos >= 0) {
+ tmp.Cut(pos, 1);
+ }
+ } else {
+ // Mismatched quotes - leave them in
+ }
+ }
+ QuoteText(tmp, tmp2);
+ fputs(tmp2, mFile);
+ fputs("\"/>\n", mFile);
}
+
+ if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
+ const nsString& content = aNode.GetSkippedContent();
+ if (content.Length() > 0) {
+ nsAutoString tmp;
+ fputs(" \n", mFile);
+ }
+ }
+
return NS_OK;
}
+PRBool
+nsLoggingSink::WillWriteAttributes(const nsIParserNode& aNode)
+{
+ PRInt32 ac = aNode.GetAttributeCount();
+ if (0 != ac) {
+ return PR_TRUE;
+ }
+ if (0 != strchr(gSkippedContentTags, aNode.GetNodeType())) {
+ const nsString& content = aNode.GetSkippedContent();
+ if (content.Length() > 0) {
+ return PR_TRUE;
+ }
+ }
+ return PR_FALSE;
+}
+
nsresult
nsLoggingSink::LeafNode(const nsIParserNode& aNode)
{
@@ -329,16 +392,21 @@ nsLoggingSink::LeafNode(const nsIParserNode& aNode)
if ((nodeType >= eHTMLTag_unknown) &&
(nodeType <= nsHTMLTag(NS_HTML_TAG_MAX))) {
const char* tag = NS_EnumToTag(nodeType);
- fprintf(mFile, "\n", tag);
- WriteAttributes(aNode);
- fputs("\n", mFile);
+ fprintf(mFile, "\n", mFile);
+ WriteAttributes(aNode);
+ fputs("\n", mFile);
+ }
+ else {
+ fputs("/>\n", mFile);
+ }
}
else {
PRInt32 pos;
nsAutoString tmp;
switch (nodeType) {
case eHTMLTag_whitespace:
- case eHTMLTag_newline:
case eHTMLTag_text:
QuoteText(aNode.GetText(), tmp);
fputs("\n", mFile);
break;
+ case eHTMLTag_newline:
+ fputs("\n", mFile);
+ break;
+
case eHTMLTag_entity:
tmp.Append(aNode.GetText());
tmp.Cut(0, 1);
@@ -368,6 +440,7 @@ nsLoggingSink::LeafNode(const nsIParserNode& aNode)
nsresult
nsLoggingSink::QuoteText(const nsString& aValue, nsString& aResult)
{
+ aResult.Truncate();
const PRUnichar* cp = aValue.GetUnicode();
const PRUnichar* end = cp + aValue.Length();
while (cp < end) {