WebKit:
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Aug 2003 20:23:33 +0000 (20:23 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Aug 2003 20:23:33 +0000 (20:23 +0000)
        Reviewed by Darin

        Fix for this bug:

        <rdar://problem/3374487>: URLs with UTF-8 escape sequences can't be accessed
when typed in the Safari location bar

        * Misc.subproj/WebNSPasteboardExtras.m:
        (-[NSPasteboard _web_bestURL]): Call _web_URLWithUserTypedString: to make a
URL from this type of string.
        * Misc.subproj/WebNSURLExtras.h:
        * Misc.subproj/WebNSURLExtras.m:
        (hexDigit): Added.
        (+[NSURL _web_URLWithUserTypedString:]): Added. Creates a URL from a string
that is typed in a user, for example, in the Safari location bar.

WebBrowser:

        Reviewed by Darin

Fix for this bug:

<rdar://problem/3374487>: URLs with UTF-8 escape sequences can't be accessed
when typed in the Safari location bar

        * BrowserNSStringExtras.m:
        (-[NSString possibleURLsForUserTypedString]): Use _web_URLWithUserTypedString:
to make URL from this type of string.

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

WebKit/ChangeLog
WebKit/Misc.subproj/WebNSPasteboardExtras.m
WebKit/Misc.subproj/WebNSURLExtras.h
WebKit/Misc.subproj/WebNSURLExtras.m

index 8b1070047618fbb5c6fa32b1fd7bb12d59b634a4..4cb64a4c2be3fc9aea9ed595b80b7f2bca78d571 100644 (file)
@@ -1,3 +1,21 @@
+2003-08-13  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Darin
+
+        Fix for this bug:
+
+        <rdar://problem/3374487>: URLs with UTF-8 escape sequences can't be accessed         
+       when typed in the Safari location bar
+
+        * Misc.subproj/WebNSPasteboardExtras.m:
+        (-[NSPasteboard _web_bestURL]): Call _web_URLWithUserTypedString: to make a
+       URL from this type of string.
+        * Misc.subproj/WebNSURLExtras.h:
+        * Misc.subproj/WebNSURLExtras.m:
+        (hexDigit): Added.
+        (+[NSURL _web_URLWithUserTypedString:]): Added. Creates a URL from a string
+       that is typed in a user, for example, in the Safari location bar.
+
 2003-08-12  John Sullivan  <sullivan@apple.com>
 
        - fixed 3369505 -- leaks of NSCFTimer after running through the 
index 27b87833e69cc84181f40f4f3ff4130ecd4d2d29..f8f31d9bd59a277b1507a3f22dc3608917e00a4a 100644 (file)
@@ -54,7 +54,7 @@ NSString *WebURLNamePboardType = nil;
     if ([types containsObject:NSStringPboardType]) {
         NSString *URLString = [self stringForType:NSStringPboardType];
         if ([URLString _web_looksLikeAbsoluteURL]) {
-            NSURL *URL = [[NSURL _web_URLWithDataAsString:URLString] _webkit_canonicalize];
+            NSURL *URL = [[NSURL _web_URLWithUserTypedString:URLString] _webkit_canonicalize];
             if (URL) {
                 return URL;
             }
index f6717b5414309b50e20fdc7f540d612e30e99a48..4310ce7d6bae3ddfcc459289362dc9bbab2dde66 100644 (file)
@@ -8,6 +8,8 @@
 
 @interface NSURL (WebNSURLExtras)
 
++ (NSURL *)_web_URLWithUserTypedString:(NSString *)string;
+
 + (NSURL *)_web_URLWithDataAsString:(NSString *)string;
 + (NSURL *)_web_URLWithDataAsString:(NSString *)string relativeToURL:(NSURL *)baseURL;
 
index 86c6024bc2053fa7cab447cb3a2d1d1b749c0f37..e2e7ccb7a7aeee481c0a3519299e11ef2a20719f 100644 (file)
@@ -22,8 +22,60 @@ static inline void ReleaseIfNotNULL(CFTypeRef object)
     }
 }
 
+static char hexDigit(int i) {
+    if (i < 0 || i > 16) {
+        ERROR("illegal hex value");
+        return '0';
+    }
+    int h = i;
+    if (h >= 10) {
+        h = h - 10 + 'a'; 
+    }
+    else {
+        h += '0';
+    }
+    return h;
+}
+
 @implementation NSURL (WebNSURLExtras)
 
++ (NSURL *)_web_URLWithUserTypedString:(NSString *)string
+{
+    if (string == nil) {
+        return nil;
+    }
+    string = [string _web_stringByTrimmingWhitespace];
+    NSData *userTypedData = [string dataUsingEncoding:NSUTF8StringEncoding];
+    ASSERT(userTypedData);
+        
+    const UInt8 *inBytes = [userTypedData bytes];
+    int inLength = [userTypedData length];
+    if (inLength == 0) {
+        return [NSURL URLWithString:@""];
+    }
+    
+    char *outBytes = malloc(inLength * 3); // large enough to %-escape every character
+    char *p = outBytes;
+    int outLength = 0;
+    int i;
+    for (i = 0; i < inLength; i++) {
+        UInt8 c = inBytes[i];
+        if (c <= 0x20 || c >= 0x7f) {
+            *p++ = '%';
+            *p++ = hexDigit(c >> 4);
+            *p++ = hexDigit(c & 0xf);
+            outLength += 3;
+        }
+        else {
+            *p++ = c;
+            outLength++;
+        }
+    }
+    NSData *data = [NSData dataWithBytesNoCopy:outBytes length:outLength]; // adopts outBytes
+    return [self _web_URLWithData:data relativeToURL:nil];
+}
+
 + (NSURL *)_web_URLWithDataAsString:(NSString *)string
 {
     if (string == nil) {