WebCore:
[WebKit-https.git] / WebCore / editing / markup.cpp
index 2572b492d73f934ff380a554bb181a5535dfc0f8..b1b9e23cb66b615118ada5b7120fd93e23ece3f3 100644 (file)
@@ -115,6 +115,28 @@ static DeprecatedString escapeTextForMarkup(const String& in, bool isAttributeVa
 
     return s;
 }
 
     return s;
 }
+    
+static String urlAttributeToQuotedString(String urlString)
+{
+    UChar quoteChar = '"';
+    if (urlString.stripWhiteSpace().startsWith("javascript:", false)) {
+        // minimal escaping for javascript urls
+        if (urlString.contains('"')) {
+            if (urlString.contains('\''))
+                urlString.replace('"', """);
+            else
+                quoteChar = '\'';
+        }
+    } else
+        // FIXME this does not fully match other browsers. Firefox escapes spaces and other special characters.
+        urlString = escapeTextForMarkup(urlString.deprecatedString(), true);
+
+    String res;
+    res.append(quoteChar);
+    res.append(urlString);
+    res.append(quoteChar);
+    return res;
+}
 
 static String stringValueForRange(const Node *node, const Range *range)
 {
 
 static String stringValueForRange(const Node *node, const Range *range)
 {
@@ -272,7 +294,10 @@ static DeprecatedString startMarkup(const Node *node, const Range *range, EAnnot
                     markup += " " + attr->name().localName().deprecatedString();
                 else
                     markup += " " + attr->name().toString().deprecatedString();
                     markup += " " + attr->name().localName().deprecatedString();
                 else
                     markup += " " + attr->name().toString().deprecatedString();
-                markup += "=\"" + escapeTextForMarkup(attr->value(), true) + "\"";
+                if (el->isURLAttribute(attr))
+                    markup += "=" + urlAttributeToQuotedString(attr->value()).deprecatedString();
+                else
+                    markup += "=\"" + escapeTextForMarkup(attr->value(), true) + "\"";
                 if (!documentIsHTML && namespaces && shouldAddNamespaceAttr(attr, *namespaces))
                     markup += addNamespace(attr->prefix(), attr->namespaceURI(), *namespaces).deprecatedString();
             }
                 if (!documentIsHTML && namespaces && shouldAddNamespaceAttr(attr, *namespaces))
                     markup += addNamespace(attr->prefix(), attr->namespaceURI(), *namespaces).deprecatedString();
             }