Reviewed by Tim Hatcher.
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Dec 2007 22:36:10 +0000 (22:36 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 6 Dec 2007 22:36:10 +0000 (22:36 +0000)
        - fix <rdar://problem/5513394> No way to detect Tiger vs Leopard from Safari's user agent string

        * WebView/WebView.mm:
        (callGestalt): Added.
        (createMacOSXVersionString): Added.
        (-[WebView _userAgentWithApplicationName:andWebKitVersion:]): Added Mac OS X version string,
        right after the string "Mac OS X", but with underscores instead of dots to avoid the dreaded
        "4." problem (old libraries that think a "4." anywhere in the user agent means Netscape 4).
        (-[WebView _userAgentForURL:]): Fixed incorrect bug numbers.

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

WebKit/mac/ChangeLog
WebKit/mac/WebView/WebView.mm

index 3e38ff02fad8ea7d3f62059b90db0a3988124e94..9dd74d8fe6cf9c665d9cbf809d4f1a685cf58185 100644 (file)
@@ -1,3 +1,17 @@
+2007-12-06  Darin Adler  <darin@apple.com>
+
+        Reviewed by Tim Hatcher.
+
+        - fix <rdar://problem/5513394> No way to detect Tiger vs Leopard from Safari's user agent string
+
+        * WebView/WebView.mm:
+        (callGestalt): Added.
+        (createMacOSXVersionString): Added.
+        (-[WebView _userAgentWithApplicationName:andWebKitVersion:]): Added Mac OS X version string,
+        right after the string "Mac OS X", but with underscores instead of dots to avoid the dreaded
+        "4." problem (old libraries that think a "4." anywhere in the user agent means Netscape 4).
+        (-[WebView _userAgentForURL:]): Fixed incorrect bug numbers.
+
 2007-12-04  Geoffrey Garen  <ggaren@apple.com>
 
         Reviewed by Darin Adler.
index 5da9ded56027267db2ed132ecaf6a7d6f6aa174f..d763212e7b949b9162711abf41a9079803e640c5 100644 (file)
@@ -4060,26 +4060,50 @@ static WebFrameView *containingFrameView(NSView *view)
     return fullVersion;
 }
 
+static inline int callGestalt(OSType selector)
+{
+    SInt32 value = 0;
+    Gestalt(selector, &value);
+    ASSERT(value);
+    return value;
+}
+
+// Uses underscores instead of dots because if "4." ever appears in a user agent string, old DHTML libraries treat it as Netscape 4.
+static NSString *createMacOSXVersionString()
+{
+    // Can't use -[NSProcessInfo operatingSystemVersionString] because it has too much stuff we don't want.
+    int major = callGestalt(gestaltSystemVersionMajor);
+    int minor = callGestalt(gestaltSystemVersionMinor);
+    int bugFix = callGestalt(gestaltSystemVersionBugFix);
+    if (bugFix)
+        return [[NSString alloc] initWithFormat:@"%d_%d_%d", major, minor, bugFix];
+    if (minor)
+        return [[NSString alloc] initWithFormat:@"%d_%d", major, minor];
+    return [[NSString alloc] initWithFormat:@"%d", major];
+}
+
 - (NSString *)_userAgentWithApplicationName:(NSString *)applicationName andWebKitVersion:(NSString *)version
 {
+    static NSString *osVersion = createMacOSXVersionString();
     NSString *language = [NSUserDefaults _webkit_preferredLanguageCode];
     if ([applicationName length])
-        return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; U; " PROCESSOR " Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko) %@", language, version, applicationName];
-    return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; U; " PROCESSOR " Mac OS X; %@) AppleWebKit/%@ (KHTML, like Gecko)", language, version];
+        return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; U; " PROCESSOR " Mac OS X %@; %@) AppleWebKit/%@ (KHTML, like Gecko) %@",
+            osVersion, language, version, applicationName];
+    return [NSString stringWithFormat:@"Mozilla/5.0 (Macintosh; U; " PROCESSOR " Mac OS X %@; %@) AppleWebKit/%@ (KHTML, like Gecko)",
+        osVersion, language, version];
 }
 
 // Get the appropriate user-agent string for a particular URL.
 - (WebCore::String)_userAgentForURL:(const WebCore::KURL&)url
 {
     if (_private->useSiteSpecificSpoofing) {
-        // FIXME: Make this a hash table lookup if more domains need spoofing.
-        // FIXME: Remove yahoo.com once <rdar://problem/5057117> is fixed.
+        // FIXME: Remove yahoo.com once <rdar://problem/4549681> is fixed.
         if (url.host().endsWith("yahoo.com")) {
             static String yahooUserAgent([self _userAgentWithApplicationName:_private->applicationNameForUserAgent andWebKitVersion:@"422"]);
             return yahooUserAgent;
         }
         
-        // FIXME: Remove flickr.com workaround once <rdar://problem/5084872> is fixed
+        // FIXME: Remove flickr.com workaround once <rdar://problem/5081617> is fixed
         if (url.host().endsWith("flickr.com")) {
             // Safari 2.0.4's user agent string works here
             static String safari204UserAgent([self _userAgentWithApplicationName:@"Safari/419.3" andWebKitVersion:@"419"]);