[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:09:17 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit 8edb4562526d635ddd4b2c4e6bcc7994df32c78a
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Nov 5 01:39:58 2003 +0000

            Reviewed by John, except for one bit reviewed by Maciej.
    
            - first step for IDNA support; helper functions for Safari
    
            * Misc.subproj/WebNSURLExtras.h: Add six new methods to manipulate host names directly.
            * Misc.subproj/WebNSURLExtras.m:
            (applyHostNameFunctionToMailToURLString): Added. Finds host names within a mailto URL.
            (applyHostNameFunctionToURLString): Added. Finds host names within a URL.
            (collectRangesThatNeedMapping): Added. Builds a list of host name ranges that need mapping.
            (collectRangesThatNeedEncoding): Added. Calls the above for encoding.
            (collectRangesThatNeedDecoding): Added. Calls the above for decoding.
            (mapHostNames): Added. Helper function that does the entire mapping process for a URL.
            (+[NSURL _web_URLWithUserTypedString:]): Call mapHostNames to encode after trimming whitespace.
            (-[NSURL _web_userVisibleString]): Call mapHostNames to decode after decoding escape sequences.
            (-[NSURL _webkit_URLByRemovingFragment]): Removed unneeded redundant NULL check.
            (-[NSString _web_mapHostNameWithRange:encode:makeString:]): Added. Workhorse function to call
            the IDN functions in the Unicode library.
            (-[NSString _web_hostNameNeedsDecodingWithRange:]): Added.
            (-[NSString _web_hostNameNeedsEncodingWithRange:]): Added.
            (-[NSString _web_decodeHostNameWithRange:]): Added.
            (-[NSString _web_encodeHostNameWithRange:]): Added.
            (-[NSString _web_decodeHostName]): Added.
            (-[NSString _web_encodeHostName]): Added.
    
            * WebKit.pbproj/project.pbxproj: Added libicucore.dylib.
            * English.lproj/StringsNotToBeLocalized.txt: Updated for above changes.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@5386 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index abc1cf4..8c10dc5 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,32 @@
+2003-11-04  Darin Adler  <darin at apple.com>
+
+        Reviewed by John, except for one bit reviewed by Maciej.
+
+        - first step for IDNA support; helper functions for Safari
+
+        * Misc.subproj/WebNSURLExtras.h: Add six new methods to manipulate host names directly.
+        * Misc.subproj/WebNSURLExtras.m:
+        (applyHostNameFunctionToMailToURLString): Added. Finds host names within a mailto URL.
+        (applyHostNameFunctionToURLString): Added. Finds host names within a URL.
+        (collectRangesThatNeedMapping): Added. Builds a list of host name ranges that need mapping.
+        (collectRangesThatNeedEncoding): Added. Calls the above for encoding.
+        (collectRangesThatNeedDecoding): Added. Calls the above for decoding.
+        (mapHostNames): Added. Helper function that does the entire mapping process for a URL.
+        (+[NSURL _web_URLWithUserTypedString:]): Call mapHostNames to encode after trimming whitespace.
+        (-[NSURL _web_userVisibleString]): Call mapHostNames to decode after decoding escape sequences.
+        (-[NSURL _webkit_URLByRemovingFragment]): Removed unneeded redundant NULL check.
+        (-[NSString _web_mapHostNameWithRange:encode:makeString:]): Added. Workhorse function to call
+        the IDN functions in the Unicode library.
+        (-[NSString _web_hostNameNeedsDecodingWithRange:]): Added.
+        (-[NSString _web_hostNameNeedsEncodingWithRange:]): Added.
+        (-[NSString _web_decodeHostNameWithRange:]): Added.
+        (-[NSString _web_encodeHostNameWithRange:]): Added.
+        (-[NSString _web_decodeHostName]): Added.
+        (-[NSString _web_encodeHostName]): Added.
+
+        * WebKit.pbproj/project.pbxproj: Added libicucore.dylib.
+        * English.lproj/StringsNotToBeLocalized.txt: Updated for above changes.
+
 2003-11-04  John Sullivan  <sullivan at apple.com>
 
         - a little optimization I noticed when looking at 3125137
diff --git a/WebKit/English.lproj/StringsNotToBeLocalized.txt b/WebKit/English.lproj/StringsNotToBeLocalized.txt
index f3efaab..e71b542 100644
--- a/WebKit/English.lproj/StringsNotToBeLocalized.txt
+++ b/WebKit/English.lproj/StringsNotToBeLocalized.txt
@@ -35,6 +35,8 @@
 "4194304"
 "7"
 "9"
+"://"
+":/?"
 ";"
 "<!--framePath "
 "="
@@ -44,6 +46,9 @@
 "=================\nERROR: "
 "=================\nFATAL ERROR: "
 "=================\nSHOULD NEVER BE REACHED (%s:%d %s)\n=================\n"
+">,"
+"@"
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-."
 "ATSUCreateStyle failed (%d)"
 "ATSUCreateTextLayoutWithTextPtr failed(%d)"
 "ATSUGetGlyphBounds() failed(%d)"
@@ -213,6 +218,8 @@
 "WebSiteURLToIconURLKey"
 "WebURLsWithTitlesPboardType"
 "\""
+"\"@?"
+"\"\\"
 "\0"
 "\n        "
 "\n    "
@@ -259,6 +266,7 @@
 "javascript:"
 "lastVisitedDate"
 "localized string not found"
+"mailto:"
 "nullplugin"
 "pluginspage"
 "text/"
@@ -279,6 +287,7 @@
 "visitCount"
 "x"
 "x-apple-web-kit/"
+"xn--"
 "~/Library/Icons"
 History.subproj/WebHistoryItem.m:" in \"%@\""
 History.subproj/WebHistoryItem.m:"children"
diff --git a/WebKit/Misc.subproj/WebNSURLExtras.h b/WebKit/Misc.subproj/WebNSURLExtras.h
index a2a9482..033cc1f 100644
--- a/WebKit/Misc.subproj/WebNSURLExtras.h
+++ b/WebKit/Misc.subproj/WebNSURLExtras.h
@@ -18,30 +18,41 @@
 
 - (NSData *)_web_originalData;
 - (NSString *)_web_originalDataAsString;
+- (const char *)_web_URLCString;
 
 - (NSString *)_web_userVisibleString;
-- (const char *)_web_URLCString;
 
 - (BOOL)_web_isEmpty;
 
 // FIXME: change these names back to _web_ when identically-named
 // methods are removed from Foundation
+
 - (NSURL *)_webkit_canonicalize;
 - (NSURL *)_webkit_URLByRemovingFragment;
+
 - (BOOL)_webkit_isJavaScriptURL;
 - (NSString *)_webkit_scriptIfJavaScriptURL;
 - (BOOL)_webkit_isFTPDirectoryURL;
+
 - (BOOL)_webkit_shouldLoadAsEmptyDocument;
 
 @end
 
 @interface NSString (WebNSURLExtras)
 
+- (BOOL)_web_hostNameNeedsDecodingWithRange:(NSRange)range; // returns NO if decodeHostNameWithRange: would return nil, but more efficient
+- (BOOL)_web_hostNameNeedsEncodingWithRange:(NSRange)range; // returns NO if encodeHostNameWithRange: would return nil, but more efficient
+
+- (NSString *)_web_decodeHostNameWithRange:(NSRange)range; // turns funny-looking ASCII form into Unicode, returns nil if no decoding needed
+- (NSString *)_web_encodeHostNameWithRange:(NSRange)range; // turns Unicode into funny-looking ASCII form, returns nil if no decoding needed
+
+- (NSString *)_web_decodeHostName; // turns funny-looking ASCII form into Unicode, returns self if no decoding needed, convenient cover
+- (NSString *)_web_encodeHostName; // turns Unicode into funny-looking ASCII form, returns self if no decoding needed, convenient cover
+
 // FIXME: change these names back to _web_ when identically-named
 // methods are removed from Foundation
-- (NSString *)_webkit_stringByReplacingValidPercentEscapes;
-- (NSString *)_webkit_scriptIfJavaScriptURL;
 - (BOOL)_webkit_isJavaScriptURL;
+- (NSString *)_webkit_scriptIfJavaScriptURL;
 - (BOOL)_webkit_isFTPDirectoryURL;
 
 @end
diff --git a/WebKit/Misc.subproj/WebNSURLExtras.m b/WebKit/Misc.subproj/WebNSURLExtras.m
index df46ba4..c5c32b6 100644
--- a/WebKit/Misc.subproj/WebNSURLExtras.m
+++ b/WebKit/Misc.subproj/WebNSURLExtras.m
@@ -13,16 +13,18 @@
 #import <Foundation/NSURLRequest.h>
 #import <Foundation/NSURL_NSURLExtras.h>
 
-static int URLBytesBufferLength = 2048;
+#import <unicode/uidna.h>
 
-static inline void ReleaseIfNotNULL(CFTypeRef object)
-{
-    if (object) {
-        CFRelease(object);
-    }
-}
+typedef void (* StringRangeApplierFunction)(NSString *string, NSRange range, void *context);
+
+// Needs to be big enough to hold an IDNA-encoded name.
+// This is way bigger than needed, since I think there's a 63-character limit.
+#define HOST_NAME_BUFFER_LENGTH 2048
 
-static char hexDigit(int i) {
+#define URL_BYTES_BUFFER_LENGTH 2048
+
+static char hexDigit(int i)
+{
     if (i < 0 || i > 16) {
         ERROR("illegal hex digit");
         return '0';
@@ -57,17 +59,202 @@ static int hexDigitValue(char c)
     return 0;
 }
 
+static void applyHostNameFunctionToMailToURLString(NSString *string, StringRangeApplierFunction f, void *context)
+{
+    // In a mailto: URL, host names come after a '@' character and end with a '>' or ',' character.
+    // Skip quoted strings so that characters in them don't confuse us.
+    // When we find a '?' character, we are past the part of the URL that contains host names.
+
+    static NSCharacterSet *hostNameOrStringStartCharacters;
+    if (hostNameOrStringStartCharacters == nil) {
+        hostNameOrStringStartCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"\"@?"] retain];
+    }
+    static NSCharacterSet *hostNameEndCharacters;
+    if (hostNameEndCharacters == nil) {
+        hostNameEndCharacters = [[NSCharacterSet characterSetWithCharactersInString:@">,"] retain];
+    }
+    static NSCharacterSet *quotedStringCharacters;
+    if (quotedStringCharacters == nil) {
+        quotedStringCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"\"\\"] retain];
+    }
+
+    unsigned stringLength = [string length];
+    NSRange remaining = NSMakeRange(0, stringLength);
+    
+    while (1) {
+        // Find start of host name or of quoted string.
+        NSRange hostNameOrStringStart = [string rangeOfCharacterFromSet:hostNameOrStringStartCharacters options:0 range:remaining];
+        if (hostNameOrStringStart.location == NSNotFound) {
+            return;
+        }
+        unichar c = [string characterAtIndex:hostNameOrStringStart.location];
+        remaining.location = NSMaxRange(hostNameOrStringStart);
+        remaining.length = stringLength - remaining.location;
+
+        if (c == '?') {
+            return;
+        }
+        
+        if (c == '@') {
+            // Find end of host name.
+            unsigned hostNameStart = remaining.location;
+            NSRange hostNameEnd = [string rangeOfCharacterFromSet:hostNameEndCharacters options:0 range:remaining];
+            if (hostNameEnd.location == NSNotFound) {
+                return;
+            }
+            remaining.location = NSMaxRange(hostNameEnd);
+            remaining.length = stringLength - remaining.location;
+
+            // Process host name range.
+            f(string, NSMakeRange(hostNameStart, hostNameEnd.location - hostNameStart), context);
+        } else {
+            // Skip quoted string.
+            ASSERT(c == '"');
+            while (1) {
+                NSRange escapedCharacterOrStringEnd = [string rangeOfCharacterFromSet:quotedStringCharacters options:0 range:remaining];
+                if (escapedCharacterOrStringEnd.location == NSNotFound) {
+                    return;
+                }
+                c = [string characterAtIndex:escapedCharacterOrStringEnd.location];
+                remaining.location = NSMaxRange(escapedCharacterOrStringEnd);
+                remaining.length = stringLength - remaining.location;
+                
+                // If we are the end of the string, then break from the string loop back to the host name loop.
+                if (c == '"') {
+                    break;
+                }
+                
+                // Skip escaped character.
+                ASSERT(c == '\\');
+                if (remaining.length == 0) {
+                    return;
+                }                
+                remaining.location += 1;
+                remaining.length -= 1;
+            }
+        }
+    }
+}
+
+static void applyHostNameFunctionToURLString(NSString *string, StringRangeApplierFunction f, void *context)
+{
+    // Find hostnames. Too bad we can't use any real URL-parsing code to do this,
+    // but we have to do it before doing all the %-escaping, and this is the only
+    // code we have that parses mailto URLs anyway.
+
+    // Maybe we should implement this using a character buffer instead?
+
+    if ([string _web_hasCaseInsensitivePrefix:@"mailto:"]) {
+        applyHostNameFunctionToMailToURLString(string, f, context);
+        return;
+    }
+
+    // Find the host name in a hierarchical URL.
+    // It comes after a "://" sequence, with scheme characters preceding.
+    // If ends with the end of the string or a ":", "/", or a "?".
+    // If there is a "@" character, the host part is just the part after the "@".
+    NSRange separatorRange = [string rangeOfString:@"://"];
+    if (separatorRange.location == NSNotFound) {
+        return;
+    }
+
+    // Check that all characters before the :// are valid scheme characters.
+    static NSCharacterSet *nonSchemeCharacters;
+    if (nonSchemeCharacters == nil) {
+        nonSchemeCharacters = [[[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-."] invertedSet] retain];
+    }
+    if ([string rangeOfCharacterFromSet:nonSchemeCharacters options:0 range:NSMakeRange(0, separatorRange.location)].location != NSNotFound) {
+        return;
+    }
+
+    unsigned stringLength = [string length];
+
+    static NSCharacterSet *hostTerminators;
+    if (hostTerminators == nil) {
+        hostTerminators = [[NSCharacterSet characterSetWithCharactersInString:@":/?"] retain];
+    }
+
+    // Start after the separator.
+    unsigned authorityStart = NSMaxRange(separatorRange);
+
+    // Find terminating character.
+    NSRange hostNameTerminator = [string rangeOfCharacterFromSet:hostTerminators options:0 range:NSMakeRange(authorityStart, stringLength - authorityStart)];
+    unsigned hostNameEnd = hostNameTerminator.location == NSNotFound ? stringLength : hostNameTerminator.location;
+
+    // Find "@" for the start of the host name.
+    NSRange userInfoTerminator = [string rangeOfString:@"@" options:0 range:NSMakeRange(authorityStart, hostNameEnd - authorityStart)];
+    unsigned hostNameStart = userInfoTerminator.location == NSNotFound ? authorityStart : NSMaxRange(userInfoTerminator);
+
+    f(string, NSMakeRange(hostNameStart, hostNameEnd - hostNameStart), context);
+}
+
 @implementation NSURL (WebNSURLExtras)
 
+static void collectRangesThatNeedMapping(NSString *string, NSRange range, void *context, BOOL encode)
+{
+    BOOL needsMapping = encode
+        ? [string _web_hostNameNeedsEncodingWithRange:range]
+        : [string _web_hostNameNeedsDecodingWithRange:range];
+    if (!needsMapping) {
+        return;
+    }
+
+    NSMutableArray **array = (NSMutableArray **)context;
+    if (*array == nil) {
+        *array = [[NSMutableArray alloc] init];
+    }
+
+    [*array addObject:[NSValue valueWithRange:range]];
+}
+
+static void collectRangesThatNeedEncoding(NSString *string, NSRange range, void *context)
+{
+    return collectRangesThatNeedMapping(string, range, context, YES);
+}
+
+static void collectRangesThatNeedDecoding(NSString *string, NSRange range, void *context)
+{
+    return collectRangesThatNeedMapping(string, range, context, NO);
+}
+
+static NSString *mapHostNames(NSString *string, BOOL encode)
+{
+    // Generally, we want to optimize for the case where there is one host name that does not need mapping.
+    
+    // Make a list of ranges that actually need mapping.
+    NSMutableArray *hostNameRanges = nil;
+    StringRangeApplierFunction f = encode
+        ? collectRangesThatNeedEncoding
+        : collectRangesThatNeedDecoding;
+    applyHostNameFunctionToURLString(string, f, &hostNameRanges);
+    if (hostNameRanges == nil) {
+        return string;
+    }
+
+    // Do the mapping.
+    NSMutableString *mutableCopy = [string mutableCopy];
+    unsigned i = [hostNameRanges count];
+    while (i-- != 0) {
+        NSRange hostNameRange = [[hostNameRanges objectAtIndex:i] rangeValue];
+        NSString *mappedHostName = encode
+            ? [string _web_encodeHostNameWithRange:hostNameRange]
+            : [string _web_decodeHostNameWithRange:hostNameRange];
+        [mutableCopy replaceCharactersInRange:hostNameRange withString:mappedHostName];
+    }
+    [hostNameRanges release];
+    return [mutableCopy autorelease];
+}
+
 + (NSURL *)_web_URLWithUserTypedString:(NSString *)string
 {
     if (string == nil) {
         return nil;
     }
-    string = [string _web_stringByTrimmingWhitespace];
+    string = mapHostNames([string _web_stringByTrimmingWhitespace], YES);
+
     NSData *userTypedData = [string dataUsingEncoding:NSUTF8StringEncoding];
     ASSERT(userTypedData);
-        
+
     const UInt8 *inBytes = [userTypedData bytes];
     int inLength = [userTypedData length];
     if (inLength == 0) {
@@ -152,8 +339,8 @@ static int hexDigitValue(char c)
 {
     NSData *data = nil;
 
-    UInt8 static_buffer[URLBytesBufferLength];
-    CFIndex bytesFilled = CFURLGetBytes((CFURLRef)self, static_buffer, URLBytesBufferLength);
+    UInt8 static_buffer[URL_BYTES_BUFFER_LENGTH];
+    CFIndex bytesFilled = CFURLGetBytes((CFURLRef)self, static_buffer, URL_BYTES_BUFFER_LENGTH);
     if (bytesFilled != -1) {
         data = [NSData dataWithBytes:static_buffer length:bytesFilled];
     }
@@ -220,7 +407,7 @@ static int hexDigitValue(char c)
         }
     }
     *q = '\0';
-  
+    
     // Check string to see if it can be converted to display using UTF-8  
     NSString *result = [NSString stringWithUTF8String:after];
     if (!result) {
@@ -248,9 +435,13 @@ static int hexDigitValue(char c)
         *q = '\0';
         result = [NSString stringWithUTF8String:after];
     }
+
+    // As an optimization, only do host name decoding if we have xn-- somewhere.
+    bool needsHostNameDecoding = strcasestr(after, "xn--") != NULL;
+  
     free(after);
     
-    return result;
+    return needsHostNameDecoding ? mapHostNames(result, NO) : result;
 }
 
 - (BOOL)_web_isEmpty
@@ -298,8 +489,7 @@ static int hexDigitValue(char c)
     if (!frag) {
         return self;
     }
-    
-    ReleaseIfNotNULL(frag);
+    CFRelease(frag);
     
     WebURLComponents components = [self _web_URLComponents];
     components.fragment = nil;
@@ -329,7 +519,6 @@ static int hexDigitValue(char c)
 
 @end
 
-
 @implementation NSString (WebNSURLExtras)
 
 - (BOOL)_webkit_isJavaScriptURL
@@ -383,4 +572,61 @@ static int hexDigitValue(char c)
     return lastChar == '/' && [self _web_hasCaseInsensitivePrefix:@"ftp:"];
 }
 
+// Return value of nil means no mapping is necessary.
+// If makeString is NO, then return value is either nil or self to indicate mapping is necessary.
+// If makeString is YES, then return value is either nil or the mapped string.
+- (NSString *)_web_mapHostNameWithRange:(NSRange)range encode:(BOOL)encode makeString:(BOOL)makeString
+{
+    if (range.length > HOST_NAME_BUFFER_LENGTH) {
+        return nil;
+    }
+    
+    UChar sourceBuffer[HOST_NAME_BUFFER_LENGTH];
+    UChar destinationBuffer[HOST_NAME_BUFFER_LENGTH];
+    
+    [self getCharacters:sourceBuffer range:range];
+    UErrorCode error = U_ZERO_ERROR;
+    int32_t numCharactersConverted = (encode ? uidna_IDNToASCII : uidna_IDNToUnicode)
+        (sourceBuffer, range.length, destinationBuffer, HOST_NAME_BUFFER_LENGTH, UIDNA_ALLOW_UNASSIGNED, NULL, &error);
+    if (error != U_ZERO_ERROR) {
+        return nil;
+    }
+    if (numCharactersConverted == (int)range.length && memcmp(sourceBuffer, destinationBuffer, range.length * sizeof(UChar)) == 0) {
+        return nil;
+    }
+    return makeString ? [NSString stringWithCharacters:destinationBuffer length:numCharactersConverted] : self;
+}
+
+- (BOOL)_web_hostNameNeedsDecodingWithRange:(NSRange)range
+{
+    return [self _web_mapHostNameWithRange:range encode:NO makeString:NO] != nil;
+}
+
+- (BOOL)_web_hostNameNeedsEncodingWithRange:(NSRange)range
+{
+    return [self _web_mapHostNameWithRange:range encode:YES makeString:NO] != nil;
+}
+
+- (NSString *)_web_decodeHostNameWithRange:(NSRange)range
+{
+    return [self _web_mapHostNameWithRange:range encode:NO makeString:YES];
+}
+
+- (NSString *)_web_encodeHostNameWithRange:(NSRange)range
+{
+    return [self _web_mapHostNameWithRange:range encode:YES makeString:YES];
+}
+
+- (NSString *)_web_decodeHostName
+{
+    NSString *name = [self _web_mapHostNameWithRange:NSMakeRange(0, [self length]) encode:NO makeString:YES];
+    return name == nil ? self : name;
+}
+
+- (NSString *)_web_encodeHostName
+{
+    NSString *name = [self _web_mapHostNameWithRange:NSMakeRange(0, [self length]) encode:YES makeString:YES];
+    return name == nil ? self : name;
+}
+
 @end
diff --git a/WebKit/WebKit.pbproj/project.pbxproj b/WebKit/WebKit.pbproj/project.pbxproj
index a14ab35..15c2f67 100644
--- a/WebKit/WebKit.pbproj/project.pbxproj
+++ b/WebKit/WebKit.pbproj/project.pbxproj
@@ -130,6 +130,7 @@
 				F5C2869302846DCD018635CA,
 				F5C2869402846DCD018635CA,
 				F5C2869502846DCD018635CA,
+				93D623DD051E791F002F47DD,
 				F738C9E903FAD3DF0321FBE0,
 				F738C9EA03FAD3DF0321FBE0,
 			);
@@ -449,6 +450,7 @@
 				F738CA5703FAD3DF0321FBE0,
 				F738CA5803FAD3DF0321FBE0,
 				BE1B2F5604755C7700CA289C,
+				93D623DE051E791F002F47DD,
 			);
 			isa = PBXFrameworksBuildPhase;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -2453,6 +2455,20 @@
 			settings = {
 			};
 		};
+		93D623DD051E791F002F47DD = {
+			expectedFileType = "compiled.mach-o.dylib";
+			isa = PBXFileReference;
+			name = libicucore.dylib;
+			path = /usr/lib/libicucore.dylib;
+			refType = 0;
+			sourceTree = "<absolute>";
+		};
+		93D623DE051E791F002F47DD = {
+			fileRef = 93D623DD051E791F002F47DD;
+			isa = PBXBuildFile;
+			settings = {
+			};
+		};
 //930
 //931
 //932

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list