WebCore:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Mar 2005 19:37:56 +0000 (19:37 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Mar 2005 19:37:56 +0000 (19:37 +0000)
        Reviewed by John.

        - fixed <rdar://problem/4020413> REGRESSION (Mail): can't use fonts with names that start with "#" in Mail (Korean fonts)

        * khtml/css/css_valueimpl.cpp:
        (DOM::isLegalIdentifier): Added. Commented out and not used.
        (DOM::quoteStringIfNeeded): Quotes the string if needed. For now only if it starts with "#".
        (DOM::CSSPrimitiveValueImpl::cssText): Call quoteStringIfNeeded when asked for cssText for an arbitrary string, since we
        need text you can re-parse.
        (DOM::FontFamilyValueImpl::cssText): Ditto.

        * khtml/editing/markup.cpp:
        (khtml::startMarkup): Added comments about lack of quoting for attributes.
        (khtml::createMarkup): Ditto.

WebKit:

        Reviewed by John.

        - fixed <rdar://problem/4020413> REGRESSION (Mail): can't use fonts with names that start with "#" in Mail (Korean fonts)

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _styleFromFontAttributes:]): Quote font name when calling setFontFamily.
        (-[WebHTMLView _addToStyle:fontA:fontB:]): Ditto.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@8779 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/css_valueimpl.cpp
WebCore/khtml/editing/markup.cpp
WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m

index 42e82e5a7f2a52557f100a679b4ca239570ea7ff..2477e6886630b8a7ebeea99e8c07975cb1c258e9 100644 (file)
@@ -1,3 +1,20 @@
+2005-03-04  Darin Adler  <darin@apple.com>
+
+        Reviewed by John.
+
+        - fixed <rdar://problem/4020413> REGRESSION (Mail): can't use fonts with names that start with "#" in Mail (Korean fonts)
+
+        * khtml/css/css_valueimpl.cpp:
+        (DOM::isLegalIdentifier): Added. Commented out and not used.
+        (DOM::quoteStringIfNeeded): Quotes the string if needed. For now only if it starts with "#".
+        (DOM::CSSPrimitiveValueImpl::cssText): Call quoteStringIfNeeded when asked for cssText for an arbitrary string, since we
+        need text you can re-parse.
+        (DOM::FontFamilyValueImpl::cssText): Ditto.
+
+        * khtml/editing/markup.cpp:
+        (khtml::startMarkup): Added comments about lack of quoting for attributes.
+        (khtml::createMarkup): Ditto.
+
 2005-03-04 Adele Amchan  <adele@apple.com>
  
        Reviewed by Maciej
index bdc17e4d66b4ae6cc14ea1f6b067525e1281023c..717101d70cb4ab9fbafcb6ca493bad6085b287cc 100644 (file)
@@ -54,6 +54,60 @@ using khtml::CSSStyleSelector;
 
 namespace DOM {
 
+#if 0
+
+// Too risky to quote all legal identifiers right now.
+// Post-Tiger we should use this function or something like it.
+
+// Return true if this string qualifies as an identifier (from the point of view of CSS syntax).
+static bool isLegalIdentifier(const DOMString &string)
+{
+    int len = string.length();
+    if (len == 0) {
+        return false;
+    }
+    QChar *p = string.unicode();
+    int i = 0;
+    if (p[0] == '-') {
+        ++i;
+    }
+    if (i == len) {
+        return false;
+    }
+    ushort code = p[i].unicode();
+    if (!(code >= 0x80 || code == '_' || isalpha(code))) {
+        return false;
+    }
+    ++i;
+    while (i != len) {
+        code = p[i].unicode();
+        if (!(code >= 0x80 || code == '-' || code == '_' || isalnum(code))) {
+            return false;
+        }
+        ++i;
+    }
+    return true;
+}
+
+#endif
+
+// Quotes the string if it needs quoting.
+// We use single quotes for now beause markup.cpp uses double quotes.
+static DOMString quoteStringIfNeeded(const DOMString &string)
+{
+    // For now, just do this for strings that start with "#" to fix Korean font names that start with "#".
+    // Post-Tiger, we should isLegalIdentifier instead after working out all the ancillary issues.
+    if (string[0] != '#') {
+        return string;
+    }
+
+    // FIXME: Also need to transform control characters into \ sequences.
+    QString s = string.string();
+    s.replace('\\', "\\\\");
+    s.replace('\'', "\\'");
+    return '\'' + s + '\'';
+}
+
 CSSStyleDeclarationImpl::CSSStyleDeclarationImpl(CSSRuleImpl *parent)
     : StyleBaseImpl(parent)
 {
@@ -912,7 +966,7 @@ DOM::DOMString CSSPrimitiveValueImpl::cssText() const
            // ###
            break;
        case CSSPrimitiveValue::CSS_STRING:
-           text = DOMString(m_value.string);
+           text = quoteStringIfNeeded(m_value.string);
            break;
        case CSSPrimitiveValue::CSS_URI:
             text  = "url(";
@@ -1109,7 +1163,7 @@ FontFamilyValueImpl::FontFamilyValueImpl( const QString &string)
 
 DOM::DOMString FontFamilyValueImpl::cssText() const
 {
-    return parsedFontName;
+    return quoteStringIfNeeded(parsedFontName);
 }
 
 FontValueImpl::FontValueImpl()
index 240141462a05c2a2edf64f4222aa11d8987813fa..0de02ff7394c448efa15d75584d8df254eec9ca3 100644 (file)
@@ -191,6 +191,7 @@ static QString startMarkup(const NodeImpl *node, const RangeImpl *range, EAnnota
                     style->ref();
                     defaultStyle->diff(style);
                     if (style->length() > 0) {
+                        // FIXME: Handle case where style->cssText() has illegal characters in it, like "
                         QString openTag = QString("<span class=\"") + AppleStyleSpanClass + "\" style=\"" + style->cssText().string() + "\">";
                         markup = openTag + markup + "</span>";
                     }
@@ -223,6 +224,7 @@ static QString startMarkup(const NodeImpl *node, const RangeImpl *range, EAnnota
                 NamedAttrMapImpl *attrs = el->attributes();
                 unsigned long length = attrs->length();
                 if (length == 0 && additionalStyle.length() > 0) {
+                    // FIXME: Handle case where additionalStyle has illegal characters in it, like "
                     markup += " " + node->getDocument()->attrName(ATTR_STYLE).string() + "=\"" + additionalStyle.string() + "\"";
                 }
                 else {
@@ -231,6 +233,7 @@ static QString startMarkup(const NodeImpl *node, const RangeImpl *range, EAnnota
                         DOMString value = attr->value();
                         if (attr->id() == ATTR_STYLE && additionalStyle.length() > 0)
                             value += "; " + additionalStyle;
+                        // FIXME: Handle case where value has illegal characters in it, like "
                         markup += " " + node->getDocument()->attrName(attr->id()).string() + "=\"" + value.string() + "\"";
                     }
                 }
@@ -433,6 +436,7 @@ QString createMarkup(const RangeImpl *range, QPtrList<NodeImpl> *nodes, EAnnotat
     }
     
     // add in the "default style" for this markup
+    // FIXME: Handle case where value has illegal characters in it, like "
     QString openTag = QString("<span class=\"") + AppleStyleSpanClass + "\" style=\"" + defaultStyle->cssText().string() + "\">";
     markups.prepend(openTag);
     markups.append("</span>");
index 45968ab6e631bd10f11d910b9a44ea8b7da6e96d..ec615938f8f096873fa549d662c51a25b172f0b7 100644 (file)
@@ -1,3 +1,13 @@
+2005-03-04  Darin Adler  <darin@apple.com>
+
+        Reviewed by John.
+
+        - fixed <rdar://problem/4020413> REGRESSION (Mail): can't use fonts with names that start with "#" in Mail (Korean fonts)
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _styleFromFontAttributes:]): Quote font name when calling setFontFamily.
+        (-[WebHTMLView _addToStyle:fontA:fontB:]): Ditto.
+
 2005-03-04  Darin Adler  <darin@apple.com>
 
         Reviewed by John.
index 62866a0c85de46857af767587741b488b92196c1..b87eb272514f249d5c5f500aacd4075c5183fb0a 100644 (file)
@@ -3636,7 +3636,9 @@ static WebHTMLView *lastHitView = nil;
         [style setFontStyle:@"normal"];
     } else {
         NSFontManager *fm = [NSFontManager sharedFontManager];
-        [style setFontFamily:[font familyName]];
+        // FIXME: Need more sophisticated escaping code if we want to handle family names
+        // with characters like single quote or backslash in their names.
+        [style setFontFamily:[NSString stringWithFormat:@"'%@'", [font familyName]]];
         [style setFontSize:[NSString stringWithFormat:@"%0.fpx", [font pointSize]]];
         if ([fm weightOfFont:font] >= 9) {
             [style setFontWeight:@"bold"];
@@ -3815,7 +3817,9 @@ static WebHTMLView *lastHitView = nil;
     NSString *fa = [a familyName];
     NSString *fb = [b familyName];
     if ([fa isEqualToString:fb]) {
-        [style setFontFamily:fa];
+        // FIXME: Need more sophisticated escaping code if we want to handle family names
+        // with characters like single quote or backslash in their names.
+        [style setFontFamily:[NSString stringWithFormat:@"'%@'", fa]];
     }
 
     int sa = [a pointSize];