Reviewed by Richard.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Aug 2004 00:43:52 +0000 (00:43 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Aug 2004 00:43:52 +0000 (00:43 +0000)
<rdar://problem/3245706> URLs with backslashes instead of slashes work on WinIE; should work on Safari (SAP)
<rdar://problem/3506429> <BASE> tag containing backslash is breaking images with absolute URLs

        * kwq/KWQKURL.mm:
        (substituteBackslashes): Helper method
        (KURL::KURL): If the URL contains any backslashes, substitute all
that appear before the query or fragment.

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

WebCore/ChangeLog-2005-08-23
WebCore/kwq/KWQKURL.mm

index e03062e..786b522 100644 (file)
@@ -1,3 +1,15 @@
+2004-08-12  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Richard.
+
+       <rdar://problem/3245706> URLs with backslashes instead of slashes work on WinIE; should work on Safari (SAP)
+       <rdar://problem/3506429> <BASE> tag containing backslash is breaking images with absolute URLs
+       
+        * kwq/KWQKURL.mm:
+        (substituteBackslashes): Helper method
+        (KURL::KURL): If the URL contains any backslashes, substitute all
+       that appear before the query or fragment.
+
 2004-08-12  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Chris
index a793906..826129d 100644 (file)
@@ -222,6 +222,23 @@ static inline int hexDigitValue(unsigned char c)
     return (c - 'A' + 10) & 0xF; // handle both upper and lower case without a branch
 }
 
+static QString substituteBackslashes(const QString &string)
+{
+    int questionPos = string.find('?');
+    int hashPos = string.find('#');
+    unsigned pathEnd;
+    
+    if (hashPos > 0 && (questionPos < 0 || questionPos > hashPos)) {
+       pathEnd = hashPos;
+    } else if (questionPos > 0) {
+       pathEnd = questionPos;
+    } else {
+       pathEnd = string.length();
+    }
+
+    return string.left(pathEnd).replace('\\','/') + string.mid(pathEnd);
+}
+
 // KURL
 
 KURL::KURL() : m_isValid(false)
@@ -324,18 +341,27 @@ KURL::KURL(const KURL &base, const QString &relative, const QTextCodec *codec)
     }
     
     bool absolute = false;
+
+    // for compatibility with Win IE, we must treat backslashes as if they were slashes
+    QString substitutedRelative;
+    bool containsBackslash = relative.contains('\\');
+    if (containsBackslash) {
+       substitutedRelative = substituteBackslashes(relative);
+    }
+
+    const QString &rel = containsBackslash ? substitutedRelative : relative;
     
-    bool allASCII = relative.isAllASCII();
+    bool allASCII = rel.isAllASCII();
     char *strBuffer;
     const char *str;
     if (allASCII) {
         strBuffer = 0;
-        str = relative.ascii();
+        str = rel.ascii();
     } else {
 #if HAVE_ICU_LIBRARY
-        QString s = encodeHostnames(relative);
+        QString s = encodeHostnames(rel);
 #else
-        QString s = relative;
+        QString s = rel;
 #endif
 
         static const QTextCodec UTF8Codec(kCFStringEncodingUTF8);
@@ -349,11 +375,11 @@ KURL::KURL(const KURL &base, const QString &relative, const QTextCodec *codec)
         // non-path parts of the URL.
         if (*pathCodec != UTF8Codec) {
             QString protocol;
-            if (relative.length() > 0 && isSchemeFirstChar(relative.at(0).latin1())) {
-                for (uint i = 1; i < relative.length(); i++) {
-                    char p = relative.at(i).latin1();
+            if (rel.length() > 0 && isSchemeFirstChar(rel.at(0).latin1())) {
+                for (uint i = 1; i < rel.length(); i++) {
+                    char p = rel.at(i).latin1();
                     if (p == ':') {
-                        protocol = relative.left(i);
+                        protocol = rel.left(i);
                         break;
                     }
                     if (!isSchemeChar(p)) {
@@ -413,7 +439,7 @@ KURL::KURL(const KURL &base, const QString &relative, const QTextCodec *codec)
     }
 
     if (absolute) {
-       parse(str, allASCII ? &relative : 0);
+       parse(str, allASCII ? &rel : 0);
     } else {
        // workaround for sites that put leading whitespace on relative URLs
        while (*str == ' ') {