Limit user agent versioning to an upper bound
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Dec 2017 01:59:53 +0000 (01:59 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Dec 2017 01:59:53 +0000 (01:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=180365
<rdar://problem/34550617>

Reviewed by Joseph Pecoraro.

Source/WebCore:

Freeze the version reported as User Agent to OS 10.13.4 (OS 11.3 on iOS) and WebKit 605.1.15
for User Agent purposes.

Test: fast/dom/navigator-userAgent-frozen.html

* page/cocoa/UserAgent.h:
* page/cocoa/UserAgent.mm:
(WebCore::versionPredatesFreeze): Helper function. Returns true for Version 10.13.3 or older.
(WebCore::systemMarketingVersionForUserAgentString):
(WebCore::userAgentBundleVersion):
(WebCore::userVisibleWebKitBundleVersionFromFullVersion): Deleted.
(WebCore::userAgentBundleVersionFromFullVersionString): Deleted.
* page/ios/UserAgentIOS.mm:
(WebCore::standardUserAgentWithApplicationName): Don't take the WebKit bundle version
as an argument, or pass it to the user agent string generator.
* page/mac/UserAgentMac.mm:
(WebCore::standardUserAgentWithApplicationName): Ditto.

Source/WebKit:

* UIProcess/ios/WebPageProxyIOS.mm:
(WebKit::WebPageProxy::standardUserAgent): Don't pass the WebKit bundle version when
creatin the User Agent string.
(WebKit::webKitBundleVersionString): Deleted.
* UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::standardUserAgent): Ditto.
(WebKit::webKitBundleVersionString): Deleted.

Source/WebKitLegacy/mac:

* WebView/WebView.mm:
(+[WebView _standardUserAgentWithApplicationName:]): Don't pass the WebKit bundle version when
creating the User Agent string.
(webKitBundleVersionString): Deleted.

LayoutTests:

* fast/dom/navigator-userAgent-frozen-expected.txt: Added.
* fast/dom/navigator-userAgent-frozen.html: Added.

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

13 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/navigator-userAgent-frozen-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/navigator-userAgent-frozen.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/cocoa/UserAgent.h
Source/WebCore/page/cocoa/UserAgent.mm
Source/WebCore/page/ios/UserAgentIOS.mm
Source/WebCore/page/mac/UserAgentMac.mm
Source/WebKit/ChangeLog
Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm
Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
Source/WebKitLegacy/mac/ChangeLog
Source/WebKitLegacy/mac/WebView/WebView.mm

index 0115874..e7ec9d9 100644 (file)
@@ -1,3 +1,14 @@
+2017-12-05  Brent Fulgham  <bfulgham@apple.com>
+
+        Limit user agent versioning to an upper bound
+        https://bugs.webkit.org/show_bug.cgi?id=180365
+        <rdar://problem/34550617>
+
+        Reviewed by Joseph Pecoraro.
+
+        * fast/dom/navigator-userAgent-frozen-expected.txt: Added.
+        * fast/dom/navigator-userAgent-frozen.html: Added.
+
 2017-12-05  Javier Fernandez  <jfernandez@igalia.com>
 
         [css-grid] Update imported Web Platform Tests
diff --git a/LayoutTests/fast/dom/navigator-userAgent-frozen-expected.txt b/LayoutTests/fast/dom/navigator-userAgent-frozen-expected.txt
new file mode 100644 (file)
index 0000000..37b1337
--- /dev/null
@@ -0,0 +1,12 @@
+Confirm WebKit does not report versions above the frozen maximums.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Major version number is within bounds.
+PASS Minor version number is within bounds.
+PASS Tiny version number is within bounds.
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/dom/navigator-userAgent-frozen.html b/LayoutTests/fast/dom/navigator-userAgent-frozen.html
new file mode 100644 (file)
index 0000000..64e88f8
--- /dev/null
@@ -0,0 +1,62 @@
+<!DOCTYPE html>\r
+<html>\r
+<head>\r
+<script src="../../resources/js-test.js"></script>\r
+<script>\r
+description("Confirm WebKit does not report versions above the frozen maximums.");\r
+</script>\r
+</head>\r
+<body>\r
+<script>\r
+function testVersion(userAgent)\r
+{\r
+    var start = userAgent.indexOf("AppleWebKit/");\r
+    if (start < 0) {\r
+        testFailed("User agent did not contain WebKit version.");\r
+        return;\r
+    }\r
+\r
+    start += 12;\r
+\r
+    var end = userAgent.indexOf(" ", start);\r
+    if (end < 0) {\r
+        testFailed("Couldn't find end of the version string.");\r
+        return;\r
+    }\r
+\r
+    var version = userAgent.substr(start, end - start);\r
+    if (version == "") {\r
+        testFailed("Malformed version string.");\r
+        return;\r
+    }\r
+    \r
+    var versionComponents = version.split('.');\r
+    if (versionComponents[0] <= 605)\r
+        testPassed("Major version number is within bounds.");\r
+    else\r
+        testFailed("Major version number is " + versionComponents[0]);\r
+\r
+    if (versionComponents.length < 2)\r
+        return;\r
+\r
+    if (versionComponents[0] < 605 || versionComponents[1] <= 1)\r
+        testPassed("Minor version number is within bounds.");\r
+    else\r
+        testFailed("Minor version number is " + versionComponents[1]);\r
+\r
+    if (versionComponents.length < 3)\r
+        return;\r
+\r
+    if (versionComponents[0] < 605 || versionComponents[1] < 1 || versionComponents[2] <= 15)\r
+        testPassed("Tiny version number is within bounds.");\r
+    else\r
+        testFailed("Tiny version number is " + versionComponents[2]);\r
+}\r
+\r
+if (window.testRunner)\r
+    testRunner.dumpAsText();\r
+\r
+testVersion(navigator.userAgent);\r
+</script>\r
+</body>\r
+</html>\r
index 0a87a9e..f23abf9 100644 (file)
@@ -1,3 +1,29 @@
+2017-12-05  Brent Fulgham  <bfulgham@apple.com>
+
+        Limit user agent versioning to an upper bound
+        https://bugs.webkit.org/show_bug.cgi?id=180365
+        <rdar://problem/34550617>
+
+        Reviewed by Joseph Pecoraro.
+
+        Freeze the version reported as User Agent to OS 10.13.4 (OS 11.3 on iOS) and WebKit 605.1.15
+        for User Agent purposes.
+
+        Test: fast/dom/navigator-userAgent-frozen.html
+
+        * page/cocoa/UserAgent.h:
+        * page/cocoa/UserAgent.mm:
+        (WebCore::versionPredatesFreeze): Helper function. Returns true for Version 10.13.3 or older.
+        (WebCore::systemMarketingVersionForUserAgentString):
+        (WebCore::userAgentBundleVersion):
+        (WebCore::userVisibleWebKitBundleVersionFromFullVersion): Deleted.
+        (WebCore::userAgentBundleVersionFromFullVersionString): Deleted.
+        * page/ios/UserAgentIOS.mm:
+        (WebCore::standardUserAgentWithApplicationName): Don't take the WebKit bundle version
+        as an argument, or pass it to the user agent string generator.
+        * page/mac/UserAgentMac.mm:
+        (WebCore::standardUserAgentWithApplicationName): Ditto. 
+
 2017-12-05  Matt Lewis  <jlewis3@apple.com>
 
         Unreviewed, rolling out r225430.
index 1e01a29..370044b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 namespace WebCore {
 
-WEBCORE_EXPORT String standardUserAgentWithApplicationName(const String& applicationName, const String& webkitVersionString);
+WEBCORE_EXPORT String standardUserAgentWithApplicationName(const String& applicationName);
 
 String systemMarketingVersionForUserAgentString();
-String userAgentBundleVersionFromFullVersionString(const String&);
+String userAgentBundleVersion();
 
 }
 
index 8173233..676e0ee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -26,8 +26,6 @@
 #import "config.h"
 #import "UserAgent.h"
 
-#import "SystemVersion.h"
-
 namespace WebCore {
 
 String systemMarketingVersionForUserAgentString()
@@ -35,38 +33,22 @@ String systemMarketingVersionForUserAgentString()
     // Use underscores instead of dots because when we first added the Mac OS X version to the user agent string
     // we were concerned about old DHTML libraries interpreting "4." as Netscape 4. That's no longer a concern for us
     // but we're sticking with the underscores for compatibility with the format used by older versions of Safari.
-    return [systemMarketingVersion() stringByReplacingOccurrencesOfString:@"." withString:@"_"];
-}
-
-static NSString *userVisibleWebKitBundleVersionFromFullVersion(NSString *fullWebKitVersion)
-{
-    // If the version is longer than 3 digits then the leading digits represent the version of the OS. Our user agent
-    // string should not include the leading digits, so strip them off and report the rest as the version. <rdar://problem/4997547>
-    NSRange nonDigitRange = [fullWebKitVersion rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]];
-    if (nonDigitRange.location == NSNotFound && fullWebKitVersion.length > 3)
-        return [fullWebKitVersion substringFromIndex:fullWebKitVersion.length - 3];
-    if (nonDigitRange.location != NSNotFound && nonDigitRange.location > 3)
-        return [fullWebKitVersion substringFromIndex:nonDigitRange.location - 3];
-    return fullWebKitVersion;
+#if PLATFORM(MAC)
+#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300
+    return ASCIILiteral("10_13_4");
+#elif __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200
+    return ASCIILiteral("10_12_6");
+#else
+    return ASCIILiteral("10_11_6");
+#endif
+#else
+    return ASCIILiteral("11_3");
+#endif
 }
 
-String userAgentBundleVersionFromFullVersionString(const String& fullWebKitVersion)
+String userAgentBundleVersion()
 {
-    // We include at most three components of the bundle version in the user agent string.
-    NSString *bundleVersion = userVisibleWebKitBundleVersionFromFullVersion(fullWebKitVersion);
-    NSScanner *scanner = [NSScanner scannerWithString:bundleVersion];
-    NSInteger periodCount = 0;
-    while (true) {
-        if (![scanner scanUpToString:@"." intoString:nullptr] || scanner.isAtEnd)
-            return bundleVersion;
-
-        if (++periodCount == 3)
-            return [bundleVersion substringToIndex:scanner.scanLocation];
-
-        ++scanner.scanLocation;
-    }
-
-    ASSERT_NOT_REACHED();
+    return ASCIILiteral("605.1.15");
 }
 
 } // namespace WebCore
index c2c2f5d..8077ae1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -77,7 +77,7 @@ static inline NSString *deviceNameForUserAgent()
     return name.autorelease();
 }
 
-String standardUserAgentWithApplicationName(const String& applicationName, const String& fullWebKitVersionString)
+String standardUserAgentWithApplicationName(const String& applicationName)
 {
     // Check to see if there is a user agent override for all WebKit clients.
     CFPropertyListRef override = CFPreferencesCopyAppValue(CFSTR("UserAgent"), CFSTR("com.apple.WebFoundation"));
@@ -88,7 +88,7 @@ String standardUserAgentWithApplicationName(const String& applicationName, const
     }
 
     // FIXME: We should implement this with String and/or StringBuilder instead.
-    NSString *webKitVersion = userAgentBundleVersionFromFullVersionString(fullWebKitVersionString);
+    NSString *webKitVersion = userAgentBundleVersion();
     NSString *osMarketingVersionString = systemMarketingVersionForUserAgentString();
     if (applicationName.isEmpty())
         return [NSString stringWithFormat:@"Mozilla/5.0 (%@; CPU %@ %@ like Mac OS X) AppleWebKit/%@ (KHTML, like Gecko)", deviceNameForUserAgent(), osNameForUserAgent(), osMarketingVersionString, webKitVersion];
index 9d9657d..3eaa82f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -38,10 +38,10 @@ namespace WebCore {
 #error Unknown architecture
 #endif
 
-String standardUserAgentWithApplicationName(const String& applicationName, const String& fullWebKitVersionString)
+String standardUserAgentWithApplicationName(const String& applicationName)
 {
     String osVersion = systemMarketingVersionForUserAgentString();
-    String webKitVersionString = userAgentBundleVersionFromFullVersionString(fullWebKitVersionString);
+    String webKitVersionString = userAgentBundleVersion();
 
     if (applicationName.isEmpty())
         return makeString("Mozilla/5.0 (Macintosh; " PROCESSOR " Mac OS X ", osVersion, ") AppleWebKit/", webKitVersionString, " (KHTML, like Gecko)");
index 51bc52c..f3581ec 100644 (file)
@@ -1,3 +1,19 @@
+2017-12-05  Brent Fulgham  <bfulgham@apple.com>
+
+        Limit user agent versioning to an upper bound
+        https://bugs.webkit.org/show_bug.cgi?id=180365
+        <rdar://problem/34550617>
+
+        Reviewed by Joseph Pecoraro.
+
+        * UIProcess/ios/WebPageProxyIOS.mm:
+        (WebKit::WebPageProxy::standardUserAgent): Don't pass the WebKit bundle version when
+        creatin the User Agent string.
+        (WebKit::webKitBundleVersionString): Deleted.
+        * UIProcess/mac/WebPageProxyMac.mm:
+        (WebKit::WebPageProxy::standardUserAgent): Ditto.
+        (WebKit::webKitBundleVersionString): Deleted.
+
 2017-12-05  Alex Christensen  <achristensen@webkit.org>
 
         Fix crash when loading a file URL that does not have a fileSystemPath representation
index 8d91f92..fd2c5a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -68,14 +68,9 @@ void WebPageProxy::platformInitialize()
 {
 }
 
-static String webKitBundleVersionString()
-{
-    return [[NSBundle bundleForClass:NSClassFromString(@"WKWebView")] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
-}
-
 String WebPageProxy::standardUserAgent(const String& applicationNameForUserAgent)
 {
-    return standardUserAgentWithApplicationName(applicationNameForUserAgent, webKitBundleVersionString());
+    return standardUserAgentWithApplicationName(applicationNameForUserAgent);
 }
 
 void WebPageProxy::getIsSpeaking(bool&)
index 00c1a72..66134b8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010-2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2010-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -91,14 +91,9 @@ void WebPageProxy::platformInitialize()
     setShouldUseImplicitRubberBandControl(clientExpectsLegacyImplicitRubberBandControl);
 }
 
-static String webKitBundleVersionString()
-{
-    return [[NSBundle bundleForClass:NSClassFromString(@"WKView")] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
-}
-
 String WebPageProxy::standardUserAgent(const String& applicationNameForUserAgent)
 {
-    return standardUserAgentWithApplicationName(applicationNameForUserAgent, webKitBundleVersionString());
+    return standardUserAgentWithApplicationName(applicationNameForUserAgent);
 }
 
 void WebPageProxy::getIsSpeaking(bool& isSpeaking)
index f2e745c..1e2ea0f 100644 (file)
@@ -1,3 +1,16 @@
+2017-12-05  Brent Fulgham  <bfulgham@apple.com>
+
+        Limit user agent versioning to an upper bound
+        https://bugs.webkit.org/show_bug.cgi?id=180365
+        <rdar://problem/34550617>
+
+        Reviewed by Joseph Pecoraro.
+
+        * WebView/WebView.mm:
+        (+[WebView _standardUserAgentWithApplicationName:]): Don't pass the WebKit bundle version when
+        creating the User Agent string.
+        (webKitBundleVersionString): Deleted.
+
 2017-12-05  Andy Estes  <aestes@apple.com>
 
         [Cocoa] Stop specifying TARGET_OS_EMBEDDED in postprocess-headers.sh's unifdef options
index 044e9e8..d6ff0e3 100644 (file)
@@ -1132,14 +1132,9 @@ static CFMutableSetRef allWebViewsSet;
 
 @implementation WebView (WebPrivate)
 
-static String webKitBundleVersionString()
-{
-    return [[NSBundle bundleForClass:[WebView class]] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
-}
-
 + (NSString *)_standardUserAgentWithApplicationName:(NSString *)applicationName
 {
-    return standardUserAgentWithApplicationName(applicationName, webKitBundleVersionString());
+    return standardUserAgentWithApplicationName(applicationName);
 }
 
 #if PLATFORM(IOS)