зеркало из https://github.com/mozilla/pjs.git
Don't play games with the <meta> tag when not serializing an entire document.
Bug 390735, patch by Ryan Jones <sciguyryan@gmail.com>, r+sr=bzbarsky, a=jst
This commit is contained in:
Родитель
614cba3144
Коммит
1d1a8676f0
|
@ -52,8 +52,8 @@ class nsAString;
|
||||||
/* starting interface: nsIContentSerializer */
|
/* starting interface: nsIContentSerializer */
|
||||||
|
|
||||||
#define NS_ICONTENTSERIALIZER_IID \
|
#define NS_ICONTENTSERIALIZER_IID \
|
||||||
{ 0x0921afbc, 0x4c6f, 0x4249, \
|
{ 0x34769de0, 0x30d0, 0x4cef, \
|
||||||
{ 0xa7, 0xf5, 0x32, 0xe4, 0x91, 0xbf, 0x6e, 0x32 } }
|
{ 0x89, 0x4a, 0xfc, 0xd8, 0xbb, 0x27, 0xc4, 0xb4 } }
|
||||||
|
|
||||||
class nsIContentSerializer : public nsISupports {
|
class nsIContentSerializer : public nsISupports {
|
||||||
public:
|
public:
|
||||||
|
@ -61,7 +61,8 @@ class nsIContentSerializer : public nsISupports {
|
||||||
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICONTENTSERIALIZER_IID)
|
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICONTENTSERIALIZER_IID)
|
||||||
|
|
||||||
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying) = 0;
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument) = 0;
|
||||||
|
|
||||||
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
||||||
PRInt32 aEndOffset, nsAString& aStr) = 0;
|
PRInt32 aEndOffset, nsAString& aStr) = 0;
|
||||||
|
|
|
@ -126,7 +126,8 @@ NS_IMPL_ISUPPORTS4(mozSanitizingHTMLSerializer,
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
mozSanitizingHTMLSerializer::Init(PRUint32 aFlags, PRUint32 dummy,
|
mozSanitizingHTMLSerializer::Init(PRUint32 aFlags, PRUint32 dummy,
|
||||||
const char* aCharSet, PRBool aIsCopying)
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument)
|
||||||
{
|
{
|
||||||
NS_ENSURE_TRUE(nsContentUtils::GetParserService(), NS_ERROR_UNEXPECTED);
|
NS_ENSURE_TRUE(nsContentUtils::GetParserService(), NS_ERROR_UNEXPECTED);
|
||||||
|
|
||||||
|
@ -138,7 +139,7 @@ mozSanitizingHTMLSerializer::Initialize(nsAString* aOutString,
|
||||||
PRUint32 aFlags,
|
PRUint32 aFlags,
|
||||||
const nsAString& allowedTags)
|
const nsAString& allowedTags)
|
||||||
{
|
{
|
||||||
nsresult rv = Init(aFlags, 0, nsnull, PR_FALSE);
|
nsresult rv = Init(aFlags, 0, nsnull, PR_FALSE, PR_FALSE);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
// XXX This is wrong. It violates XPCOM string ownership rules.
|
// XXX This is wrong. It violates XPCOM string ownership rules.
|
||||||
|
|
|
@ -72,7 +72,7 @@ public:
|
||||||
|
|
||||||
// nsIContentSerializer
|
// nsIContentSerializer
|
||||||
NS_IMETHOD Init(PRUint32 flags, PRUint32 dummy, const char* aCharSet,
|
NS_IMETHOD Init(PRUint32 flags, PRUint32 dummy, const char* aCharSet,
|
||||||
PRBool aIsCopying);
|
PRBool aIsCopying, PRBool aIsWholeDocument);
|
||||||
|
|
||||||
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
||||||
PRInt32 aEndOffset, nsAString& aStr);
|
PRInt32 aEndOffset, nsAString& aStr);
|
||||||
|
|
|
@ -893,7 +893,9 @@ nsDocumentEncoder::EncodeToString(nsAString& aOutputString)
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mSerializer->Init(mFlags, mWrapColumn, mCharset.get(), mIsCopying);
|
|
||||||
|
PRBool isWholeDocument = !(mSelection || mRange || mNode);
|
||||||
|
mSerializer->Init(mFlags, mWrapColumn, mCharset.get(), mIsCopying, isWholeDocument);
|
||||||
|
|
||||||
if (mSelection) {
|
if (mSelection) {
|
||||||
nsCOMPtr<nsIDOMRange> range;
|
nsCOMPtr<nsIDOMRange> range;
|
||||||
|
|
|
@ -93,6 +93,7 @@ nsHTMLContentSerializer::nsHTMLContentSerializer()
|
||||||
mInBody(PR_FALSE),
|
mInBody(PR_FALSE),
|
||||||
mAddSpace(PR_FALSE),
|
mAddSpace(PR_FALSE),
|
||||||
mMayIgnoreLineBreakSequence(PR_FALSE),
|
mMayIgnoreLineBreakSequence(PR_FALSE),
|
||||||
|
mIsWholeDocument(PR_FALSE),
|
||||||
mInCDATA(PR_FALSE),
|
mInCDATA(PR_FALSE),
|
||||||
mNeedLineBreaker(PR_TRUE)
|
mNeedLineBreaker(PR_TRUE)
|
||||||
{
|
{
|
||||||
|
@ -112,7 +113,8 @@ nsHTMLContentSerializer::~nsHTMLContentSerializer()
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying)
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument)
|
||||||
{
|
{
|
||||||
mFlags = aFlags;
|
mFlags = aFlags;
|
||||||
if (!aWrapColumn) {
|
if (!aWrapColumn) {
|
||||||
|
@ -122,6 +124,7 @@ nsHTMLContentSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
||||||
mMaxColumn = aWrapColumn;
|
mMaxColumn = aWrapColumn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mIsWholeDocument = aIsWholeDocument;
|
||||||
mIsCopying = aIsCopying;
|
mIsCopying = aIsCopying;
|
||||||
mIsFirstChildOfOL = PR_FALSE;
|
mIsFirstChildOfOL = PR_FALSE;
|
||||||
mDoFormat = (mFlags & nsIDocumentEncoder::OutputFormatted) ? PR_TRUE
|
mDoFormat = (mFlags & nsIDocumentEncoder::OutputFormatted) ? PR_TRUE
|
||||||
|
@ -636,7 +639,7 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
|
||||||
|
|
||||||
// We need too skip any meta tags that set the content type
|
// We need too skip any meta tags that set the content type
|
||||||
// becase we set our own later.
|
// becase we set our own later.
|
||||||
if (name == nsGkAtoms::meta) {
|
if (mIsWholeDocument && name == nsGkAtoms::meta) {
|
||||||
nsAutoString header;
|
nsAutoString header;
|
||||||
content->GetAttr(kNameSpaceID_None, nsGkAtoms::httpEquiv, header);
|
content->GetAttr(kNameSpaceID_None, nsGkAtoms::httpEquiv, header);
|
||||||
if (header.LowerCaseEqualsLiteral("content-type")) {
|
if (header.LowerCaseEqualsLiteral("content-type")) {
|
||||||
|
@ -738,7 +741,7 @@ nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
|
||||||
mInCDATA = PR_TRUE;
|
mInCDATA = PR_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == nsGkAtoms::head) {
|
if (mIsWholeDocument && name == nsGkAtoms::head) {
|
||||||
AppendToString(mLineBreak, aStr);
|
AppendToString(mLineBreak, aStr);
|
||||||
AppendToString(NS_LITERAL_STRING("<meta http-equiv=\"content-type\""),
|
AppendToString(NS_LITERAL_STRING("<meta http-equiv=\"content-type\""),
|
||||||
aStr);
|
aStr);
|
||||||
|
@ -765,7 +768,7 @@ nsHTMLContentSerializer::AppendElementEnd(nsIDOMElement *aElement,
|
||||||
nsIAtom *name = content->Tag();
|
nsIAtom *name = content->Tag();
|
||||||
|
|
||||||
// So that we don't mess up the line breaks.
|
// So that we don't mess up the line breaks.
|
||||||
if (name == nsGkAtoms::meta) {
|
if (mIsWholeDocument && name == nsGkAtoms::meta) {
|
||||||
nsAutoString header;
|
nsAutoString header;
|
||||||
content->GetAttr(kNameSpaceID_None, nsGkAtoms::httpEquiv, header);
|
content->GetAttr(kNameSpaceID_None, nsGkAtoms::httpEquiv, header);
|
||||||
if (header.LowerCaseEqualsLiteral("content-type")) {
|
if (header.LowerCaseEqualsLiteral("content-type")) {
|
||||||
|
|
|
@ -58,7 +58,8 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
|
||||||
virtual ~nsHTMLContentSerializer();
|
virtual ~nsHTMLContentSerializer();
|
||||||
|
|
||||||
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying);
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument);
|
||||||
|
|
||||||
NS_IMETHOD AppendText(nsIDOMText* aText,
|
NS_IMETHOD AppendText(nsIDOMText* aText,
|
||||||
PRInt32 aStartOffset,
|
PRInt32 aStartOffset,
|
||||||
|
@ -139,6 +140,10 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
|
||||||
PRPackedBool mAddSpace;
|
PRPackedBool mAddSpace;
|
||||||
PRPackedBool mMayIgnoreLineBreakSequence;
|
PRPackedBool mMayIgnoreLineBreakSequence;
|
||||||
|
|
||||||
|
// This is to ensure that we only do meta tag fixups when dealing with
|
||||||
|
// whole documents.
|
||||||
|
PRPackedBool mIsWholeDocument;
|
||||||
|
|
||||||
// To keep track of First LI child of OL in selected range
|
// To keep track of First LI child of OL in selected range
|
||||||
PRPackedBool mIsFirstChildOfOL;
|
PRPackedBool mIsFirstChildOfOL;
|
||||||
PRInt32 mPreLevel;
|
PRInt32 mPreLevel;
|
||||||
|
|
|
@ -149,7 +149,8 @@ NS_IMPL_ISUPPORTS4(nsPlainTextSerializer,
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsPlainTextSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
nsPlainTextSerializer::Init(PRUint32 aFlags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying)
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Check if the major control flags are set correctly.
|
// Check if the major control flags are set correctly.
|
||||||
|
@ -274,7 +275,7 @@ NS_IMETHODIMP
|
||||||
nsPlainTextSerializer::Initialize(nsAString* aOutString,
|
nsPlainTextSerializer::Initialize(nsAString* aOutString,
|
||||||
PRUint32 aFlags, PRUint32 aWrapCol)
|
PRUint32 aFlags, PRUint32 aWrapCol)
|
||||||
{
|
{
|
||||||
nsresult rv = Init(aFlags, aWrapCol, nsnull, PR_FALSE);
|
nsresult rv = Init(aFlags, aWrapCol, nsnull, PR_FALSE, PR_FALSE);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
// XXX This is wrong. It violates XPCOM string ownership rules.
|
// XXX This is wrong. It violates XPCOM string ownership rules.
|
||||||
|
|
|
@ -69,7 +69,8 @@ public:
|
||||||
|
|
||||||
// nsIContentSerializer
|
// nsIContentSerializer
|
||||||
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying);
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument);
|
||||||
|
|
||||||
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
||||||
PRInt32 aEndOffset, nsAString& aStr);
|
PRInt32 aEndOffset, nsAString& aStr);
|
||||||
|
|
|
@ -93,7 +93,8 @@ NS_IMPL_ISUPPORTS1(nsXMLContentSerializer, nsIContentSerializer)
|
||||||
|
|
||||||
NS_IMETHODIMP
|
NS_IMETHODIMP
|
||||||
nsXMLContentSerializer::Init(PRUint32 flags, PRUint32 aWrapColumn,
|
nsXMLContentSerializer::Init(PRUint32 flags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying)
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument)
|
||||||
{
|
{
|
||||||
mCharset = aCharSet;
|
mCharset = aCharSet;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
|
|
|
@ -60,7 +60,8 @@ class nsXMLContentSerializer : public nsIContentSerializer {
|
||||||
NS_DECL_ISUPPORTS
|
NS_DECL_ISUPPORTS
|
||||||
|
|
||||||
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
NS_IMETHOD Init(PRUint32 flags, PRUint32 aWrapColumn,
|
||||||
const char* aCharSet, PRBool aIsCopying);
|
const char* aCharSet, PRBool aIsCopying,
|
||||||
|
PRBool aIsWholeDocument);
|
||||||
|
|
||||||
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
NS_IMETHOD AppendText(nsIDOMText* aText, PRInt32 aStartOffset,
|
||||||
PRInt32 aEndOffset, nsAString& aStr);
|
PRInt32 aEndOffset, nsAString& aStr);
|
||||||
|
|
|
@ -86,6 +86,7 @@ _TEST_FILES = test_bug5141.html \
|
||||||
test_bug373181.xhtml \
|
test_bug373181.xhtml \
|
||||||
test_bug375314.html \
|
test_bug375314.html \
|
||||||
test_bug382113.html \
|
test_bug382113.html \
|
||||||
|
test_bug390735.html \
|
||||||
bug382113_object.html \
|
bug382113_object.html \
|
||||||
test_CrossSiteXHR.html \
|
test_CrossSiteXHR.html \
|
||||||
file_CrossSiteXHR_fail1.xml \
|
file_CrossSiteXHR_fail1.xml \
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<!--
|
||||||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=390735
|
||||||
|
-->
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Test for Bug 390735</title>
|
||||||
|
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p id="display"></p>
|
||||||
|
<div id="content" style="display: none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<pre id="test">
|
||||||
|
<script class="testbody" type="text/javascript">
|
||||||
|
/** Test for Bug 390735 **/
|
||||||
|
|
||||||
|
var contents = document.getElementsByTagName("head")[0].innerHTML;
|
||||||
|
var expectedFind = "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">";
|
||||||
|
|
||||||
|
ok(contents.indexOf(expectedFind) > -1, "The meta tag element was not found");
|
||||||
|
</script>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
Загрузка…
Ссылка в новой задаче