Commit 8bdcbd0b authored by L. David Baron's avatar L. David Baron
Browse files

Quote and escape contents of url() when serializing. (Bug 478160) r+sr=bzbarsky

parent 79a32cbc
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -397,9 +397,10 @@ nsCSSDeclaration::AppendCSSValueToString(nsCSSProperty aProperty,
    }
  }
  else if (eCSSUnit_URL == unit || eCSSUnit_Image == unit) {
    aResult.Append(NS_LITERAL_STRING("url(") +
                   nsDependentString(aValue.GetOriginalURLValue()) +
                   NS_LITERAL_STRING(")"));
    aResult.Append(NS_LITERAL_STRING("url("));
    nsStyleUtil::AppendEscapedCSSString(
      nsDependentString(aValue.GetOriginalURLValue()), aResult);
    aResult.Append(NS_LITERAL_STRING(")"));
  }
  else if (eCSSUnit_Percent == unit) {
    nsAutoString tmpStr;
+8 −9
Original line number Diff line number Diff line
@@ -571,7 +571,7 @@ NS_IMETHODIMP
CSSImportRuleImpl::GetCssText(nsAString& aCssText)
{
  aCssText.AssignLiteral("@import url(");
  aCssText.Append(mURLSpec);
  nsStyleUtil::AppendEscapedCSSString(mURLSpec, aCssText);
  aCssText.Append(NS_LITERAL_STRING(")"));
  if (mMedia) {
    nsAutoString mediaText;
@@ -1162,19 +1162,18 @@ nsCSSDocumentRule::GetCssText(nsAString& aCssText)
  for (URL *url = mURLs; url; url = url->next) {
    switch (url->func) {
      case eURL:
        aCssText.AppendLiteral("url(\"");
        aCssText.AppendLiteral("url(");
        break;
      case eURLPrefix:
        aCssText.AppendLiteral("url-prefix(\"");
        aCssText.AppendLiteral("url-prefix(");
        break;
      case eDomain:
        aCssText.AppendLiteral("domain(\"");
        aCssText.AppendLiteral("domain(");
        break;
    }
    nsCAutoString escapedURL(url->url);
    escapedURL.ReplaceSubstring("\"", "\\\""); // escape quotes
    AppendUTF8toUTF16(escapedURL, aCssText);
    aCssText.AppendLiteral("\"), ");
    nsStyleUtil::AppendEscapedCSSString(NS_ConvertUTF8toUTF16(url->url),
                                        aCssText);
    aCssText.AppendLiteral("), ");
  }
  aCssText.Cut(aCssText.Length() - 2, 1); // remove last ,

@@ -1447,7 +1446,7 @@ CSSNameSpaceRuleImpl::GetCssText(nsAString& aCssText)
    aCssText.AppendLiteral(" ");
  }
  aCssText.AppendLiteral("url(");
  aCssText.Append(mURLSpec);
  nsStyleUtil::AppendEscapedCSSString(mURLSpec, aCssText);
  aCssText.Append(NS_LITERAL_STRING(");"));
  return NS_OK;
}
+8 −43
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
#include "nsXPIDLString.h"
#include "nsCRT.h"
#include "nsPresContext.h"
#include "nsStyleUtil.h"

nsROCSSPrimitiveValue::nsROCSSPrimitiveValue(PRInt32 aAppUnitsPerInch)
  : mType(CSS_PX), mAppUnitsPerInch(aAppUnitsPerInch)
@@ -59,44 +60,6 @@ nsROCSSPrimitiveValue::~nsROCSSPrimitiveValue()
  Reset();
}

void
nsROCSSPrimitiveValue::GetEscapedURI(nsIURI *aURI, PRUnichar **aReturn)
{
  nsCAutoString specUTF8;
  aURI->GetSpec(specUTF8);
  NS_ConvertUTF8toUTF16 spec(specUTF8);

  PRUint16 length = spec.Length();
  PRUnichar *escaped = (PRUnichar *)nsMemory::Alloc(length * 2 * sizeof(PRUnichar) + sizeof(PRUnichar('\0')));

  if (escaped) {
    PRUnichar *ptr = escaped;

    for (PRUint16 i = 0; i < length; ++i) {
      switch (spec[i]) {
        case ' ' : // space
        case '\t': // tab
        case '(' : // opening parenthesis
        case ')' : // closing parenthesis
        case '\'': // single quote
        case '"' : // double quote
        case ',' : // comma
        case '\\': // backslash
          // We have one of the above special characters.
          // Prepend it with a backslash.
          *ptr++ = '\\';
          break;
        default:
          break;
      }
      *ptr++ = spec[i];
    }
    *ptr = 0;
  }
  *aReturn = escaped;
}


NS_IMPL_ADDREF(nsROCSSPrimitiveValue)
NS_IMPL_RELEASE(nsROCSSPrimitiveValue)

@@ -142,12 +105,14 @@ nsROCSSPrimitiveValue::GetCssText(nsAString& aCssText)
      }
    case CSS_URI :
      {
        nsXPIDLString uri;
        if (mValue.mURI) {
          GetEscapedURI(mValue.mURI, getter_Copies(uri));
          tmpStr.Assign(NS_LITERAL_STRING("url(") +
                        uri +
                        NS_LITERAL_STRING(")"));
          nsCAutoString specUTF8;
          mValue.mURI->GetSpec(specUTF8);

          tmpStr.AssignLiteral("url(");
          nsStyleUtil::AppendEscapedCSSString(NS_ConvertUTF8toUTF16(specUTF8),
                                              tmpStr);
          tmpStr.AppendLiteral(")");
        } else {
          // XXXldb Any better ideas?  It's good to have something that
          // doesn't parse so that things round-trip "correctly".
+0 −2
Original line number Diff line number Diff line
@@ -209,8 +209,6 @@ public:
  }

private:
  void GetEscapedURI(nsIURI *aURI, PRUnichar **aReturn);

  PRUint16 mType;

  union {
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ css_properties.js: host_ListCSSProperties$(HOST_BIN_SUFFIX) css_properties_like_
GARBAGE += css_properties.js

_TEST_FILES =	test_acid3_test46.html \
		test_at_rule_parse_serialize.html \
		test_bug73586.html \
		test_bug74880.html \
		test_bug98997.html \
Loading