WebCore:
[WebKit-https.git] / WebCore / loader / mac / LoaderNSURLExtras.m
index 8960c2fa73eb15bf8517115cb6840e8754c14226..dd4c7d26cab0b6bd12ec0ce9a8061ee0a7856546 100644 (file)
 
 using namespace WebCore;
 
 
 using namespace WebCore;
 
-NSURL *urlByRemovingComponent(NSURL *url, CFURLComponentType component)
-{
-    if (!url)
-        return nil;
-
-    CFRange fragRg = CFURLGetByteRangeForComponent((CFURLRef)url, component, NULL);
-    // Check to see if a fragment exists before decomposing the URL.
-    if (fragRg.location == kCFNotFound)
-        return url;
-
-    UInt8 *urlBytes, buffer[2048];
-    CFIndex numBytes = CFURLGetBytes((CFURLRef)url, buffer, 2048);
-    if (numBytes == -1) {
-        numBytes = CFURLGetBytes((CFURLRef)url, NULL, 0);
-        urlBytes = static_cast<UInt8*>(malloc(numBytes));
-        CFURLGetBytes((CFURLRef)url, urlBytes, numBytes);
-    } else
-        urlBytes = buffer;
-    
-    NSURL *result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingUTF8, NULL));
-    if (!result)
-        result = (NSURL *)CFMakeCollectable(CFURLCreateWithBytes(NULL, urlBytes, fragRg.location - 1, kCFStringEncodingISOLatin1, NULL));
-    
-    if (urlBytes != buffer) free(urlBytes);
-    return result ? [result autorelease] : url;
-}
-
-NSURL *urlByRemovingFragment(NSURL *url)
-{
-    return urlByRemovingComponent(url, kCFURLComponentFragment);
-}
-
-NSString *urlOriginalDataAsString(NSURL *url)
-{
-    return [[[NSString alloc] initWithData:urlOriginalData(url) encoding:NSISOLatin1StringEncoding] autorelease];
-}
-
-#define URL_BYTES_BUFFER_LENGTH 2048
-
-NSData *urlOriginalData(NSURL *url)
-{
-    if (!url)
-        return nil;
-
-    UInt8 *buffer = (UInt8 *)malloc(URL_BYTES_BUFFER_LENGTH);
-    CFIndex bytesFilled = CFURLGetBytes((CFURLRef)url, buffer, URL_BYTES_BUFFER_LENGTH);
-    if (bytesFilled == -1) {
-        CFIndex bytesToAllocate = CFURLGetBytes((CFURLRef)url, NULL, 0);
-        buffer = (UInt8 *)realloc(buffer, bytesToAllocate);
-        bytesFilled = CFURLGetBytes((CFURLRef)url, buffer, bytesToAllocate);
-        ASSERT(bytesFilled == bytesToAllocate);
-    }
-    
-    // buffer is adopted by the NSData
-    NSData *data = [NSData dataWithBytesNoCopy:buffer length:bytesFilled freeWhenDone:YES];
-    
-    NSURL *baseURL = (NSURL *)CFURLGetBaseURL((CFURLRef)url);
-    if (baseURL)
-        return urlOriginalData(urlWithDataRelativeToURL(data, baseURL));
-    return data;
-}
-
-NSURL *urlWithData(NSData *data)
-{
-    if (data == nil)
-        return nil;
-
-    return urlWithDataRelativeToURL(data, nil);
-}      
-
-static inline id WebCFAutorelease(CFTypeRef obj)
-{
-    if (obj)
-        CFMakeCollectable(obj);
-    [(id)obj autorelease];
-    return (id)obj;
-}
-
-NSURL *urlWithDataRelativeToURL(NSData *data, NSURL *baseURL)
-{
-    if (data == nil)
-        return nil;
-    
-    NSURL *result = nil;
-    size_t length = [data length];
-    if (length > 0) {
-        // work around <rdar://4470771>: CFURLCreateAbsoluteURLWithBytes(.., TRUE) doesn't remove non-path components.
-        baseURL = urlByRemovingResourceSpecifier(baseURL);
-        
-        const UInt8 *bytes = static_cast<const UInt8*>([data bytes]);
-        // NOTE: We use UTF-8 here since this encoding is used when computing strings when returning URL components
-        // (e.g calls to NSURL -path). However, this function is not tolerant of illegal UTF-8 sequences, which
-        // could either be a malformed string or bytes in a different encoding, like shift-jis, so we fall back
-        // onto using ISO Latin 1 in those cases.
-        result = WebCFAutorelease(CFURLCreateAbsoluteURLWithBytes(NULL, bytes, length, kCFStringEncodingUTF8, (CFURLRef)baseURL, YES));
-        if (!result)
-            result = WebCFAutorelease(CFURLCreateAbsoluteURLWithBytes(NULL, bytes, length, kCFStringEncodingISOLatin1, (CFURLRef)baseURL, YES));
-    } else
-        result = [NSURL URLWithString:@""];
-
-    return result;
-}
-
-NSURL *urlByRemovingResourceSpecifier(NSURL *url)
-{
-    return urlByRemovingComponent(url, kCFURLComponentResourceSpecifier);
-}
-
-
-BOOL urlIsFileURL(NSURL *url)
-{
-    if (!url)
-        return false;
-
-    return stringIsFileURL(urlOriginalDataAsString(url));
-}
-
-BOOL stringIsFileURL(NSString *urlString)
-{
-    return [urlString rangeOfString:@"file:" options:(NSCaseInsensitiveSearch | NSAnchoredSearch)].location != NSNotFound;
-}
-
-BOOL urlIsEmpty(NSURL *url)
-{
-    if (!url)
-        return false;
-    if (!CFURLGetBaseURL((CFURLRef)url))
-        return CFURLGetBytes((CFURLRef)url, NULL, 0) == 0;
-    return [urlOriginalData(url) length] == 0;
-}
-
-NSURL *canonicalURL(NSURL *url)
-{
-    if (!url)
-        return nil;
-    
-    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
-    Class concreteClass = wkNSURLProtocolClassForReqest(request);
-    if (!concreteClass) {
-        [request release];
-        return url;
-    }
-    
-    // This applies NSURL's concept of canonicalization, but not KURL's concept. It would
-    // make sense to apply both, but when we tried that it caused a performance degradation
-    // (see 5315926). It might make sense to apply only the KURL concept and not the NSURL
-    // concept, but it's too risky to make that change for WebKit 3.0.
-    NSURLRequest *newRequest = [concreteClass canonicalRequestForRequest:request];
-    NSURL *newURL = [newRequest URL]; 
-    NSURL *result = [[newURL retain] autorelease]; 
-    [request release];
-    
-    return result;
-}
-
-static bool vectorContainsString(Vector<String> vector, String string)
+static bool vectorContainsString(const Vector<String>& vector, const String& string)
 {
     int size = vector.size();
     for (int i = 0; i < size; i++)
 {
     int size = vector.size();
     for (int i = 0; i < size; i++)